Почему мой Symfony2 устанавливает 404ing при доступе к app.php? - PullRequest
39 голосов
/ 09 августа 2011

В Symfony2 при локальном доступе к моему приложению через app_dev.php все работает нормально.Однако, когда я получаю доступ к app.php, это 404s:

Упс!Произошла ошибка

Сервер вернул сообщение «404 Not Found».

Что-то не работает.Пожалуйста, напишите нам на [email] и сообщите нам, что вы делали, когда произошла эта ошибка.Мы исправим это как можно скорее.Извините за

Ответы [ 12 ]

22 голосов
/ 09 августа 2011

Новая установка Symfony 2 не содержит маршрутизации для производственной среды. Если вы посмотрите под app/config/routing_dev.yml, вы заметите, что все маршруты, которые вы видите в демонстрационном приложении, определены только для разработки. Если вы хотите протестировать демо на app.php, вы должны сначала скопировать маршрутизацию с routing_dev.yml на routing.yml, а также включить AcmeDemoBundle под вами AppKernel.php:

$bundles = array(
        new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
        new Symfony\Bundle\SecurityBundle\SecurityBundle(),
        new Symfony\Bundle\TwigBundle\TwigBundle(),
        new Symfony\Bundle\MonologBundle\MonologBundle(),
        new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
        new Symfony\Bundle\DoctrineBundle\DoctrineBundle(),
        new Symfony\Bundle\AsseticBundle\AsseticBundle(),
        new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
        new JMS\SecurityExtraBundle\JMSSecurityExtraBundle(),
+       new Acme\DemoBundle\AcmeDemoBundle()
    }

if (in_array($this->getEnvironment(), array('dev', 'test'))) {
-       $bundles[] = new Acme\DemoBundle\AcmeDemoBundle();
        $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
        $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle();
        $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();
    } 

(+ это строка, которую вы должны добавить, - это строка, которую вы должны удалить)

17 голосов
/ 22 ноября 2013

У меня была такая же проблема, и я только что очистил кеш. php app/console cache:clear --env=prod Это решило мою проблему.

Не устанавливайте атрибут в true: $ kernel = new AppKernel ('prod', TRUE); он активирует режим отладки и не рекомендуется для продукта.

4 голосов
/ 26 июня 2015

Это нормальное кэширование Symfony, выполняющее свою работу. Любые сделанные вами изменения будут доступны для просмотра / тестирования в app_dev.php (среда разработки), но не в app.php (производственная среда), поскольку он кэширует все.

Я следую простому правилу, которое работает. Каждый раз, когда я обновляю что-либо в app\config\routing.yml (или на самом деле любое изменение) и хочу увидеть это в работе, вы должны CLEAR THE CACHE , выполнив следующую консольную команду:

Symfony 2. *: php app/console cache:clear --env=prod

Symfony 3. *: php bin/console cache:clear --env=prod

Теперь попробуйте перезагрузить страницу в браузере, и вы увидите, что она работает.

4 голосов
/ 09 августа 2011

Была такая же проблема .

на самом деле может быть несколько проблем. но вы должны очистить кеш с помощью команды console, поскольку symfony кэширует маршруты, шаблоны и конфигурацию.

3 голосов
/ 20 марта 2015

Хорошо, у меня была та же проблема, и очистка кеша не решила ее.После часа чтения постов, где все говорят «очистить кеш», я решил по-настоящему понять, что происходит.Поэтому я постараюсь объяснить другим людям, таким как я (которые только начали).Надеюсь, я не ошибаюсь, и если да, поправьте меня, пожалуйста.

Я предполагаю, что вы следуете учебнику, в котором у вас есть Acme/DemoBundle.И доступ к нему из производственной среды дает вам 404.Прежде всего, вы должны четко понимать, что означает пакет в Symfony.Это что-то вроде плагина.Это похоже на головоломку.Symfony - это большая головоломка, а ваше приложение - часть головоломки.

Итак, сначала давайте посмотрим на файл AppKernel.php в ./app.То, что мы видим, это регистрация пакетов.Как положить кусочки головоломки.И сначала мы говорим «хорошо, я хочу основные части головоломки, пакеты Symfony», а затем мы говорим «и если я нахожусь в режиме отладки, я также хочу некоторые другие части».И есть твоя часть, твоя связка.Вот почему вы не можете получить к нему доступ из производственной среды.Вы регистрируете пакет только из среды разработчика.Зарегистрируйте свой пакет (Acme/DemoBundle/AcmeDemoBundle) вверху, и вы сможете получить к нему доступ из производственной среды.

Во-вторых, перейдите в ./app/config/routing_dev.yml.Это маршрутизация для среды разработки.Мы говорим: «Хорошо, у меня есть некоторая информация о маршрутизации в @AcmeDemoBundle/Resources/config/routing.yml, и в среде разработки наш пакет найден. Но посмотрите в ./app/config/routing.yml. Мы ничего не упоминаем о нашей пользовательской маршрутизации.Я не знаю о существовании нашего файла маршрутизации. И это в производственной среде. Поэтому добавление последней части routing_dev.yml к routing.yml./app/config/) должно решить проблему.

После этогоочистите кеш и проверьте, работает ли /app.php/random/[number]. Должно быть.

Надеюсь, это поможет кому-то вроде меня, понимая некоторые основы.

2 голосов
/ 19 апреля 2013

Я должен согласиться с Эндрю.

Превращение второго AppKernel в TRUE просто позволяет получить более четкое сообщение об отладке (и вы можете заметить, что приложение работает не быстрее, чем ожидалось).

В моем случае, он сказал мне, что у меня нет доступного маршрута _welcome для производства (т.е. routing.yml).

Мне пришлось добавить следующие строки, как упомянуто Мисбах, и следовать другим распространенным процедурам, чтобы приложение работало на полной скорости.

_welcome:
    pattern:  /
    defaults: { _controller: AcmeDemoBundle:Welcome:index }
2 голосов
/ 22 сентября 2011

Когда вы следуете ответу Антона и все еще получаете сообщение об ошибке, вы можете попробовать следующий способ

На routing.yml добавить следующие строки (только)

_welcome:
    pattern:  /
    defaults: { _controller: AcmeDemoBundle:Welcome:index }

_demo_secured:
    resource: "@AcmeDemoBundle/Controller/SecuredController.php"
    type:     annotation

_demo:
    resource: "@AcmeDemoBundle/Controller/DemoController.php"
    type:     annotation
    prefix:   /demo

donне добавляйте эти строки

_assetic:
    resource: .
    type:     assetic

_wdt:
    resource: "@WebProfilerBundle/Resources/config/routing/wdt.xml"
    prefix:   /_wdt

_profiler:
    resource: "@WebProfilerBundle/Resources/config/routing/profiler.xml"
    prefix:   /_profiler

_configurator:
    resource: "@SensioDistributionBundle/Resources/config/routing/webconfigurator.xml"
    prefix:   /_configurator

_main:
    resource: routing.yml

Это пример routing.yml, который я написал

# Internal routing configuration to handle ESI
#_internal:
#   resource: "@FrameworkBundle/Resources/config/routing/internal.xml"
#   prefix:   /_internal
_welcome:
    pattern:  /
    defaults: { _controller: AcmeDemoBundle:Welcome:index }

_demo_secured:
    resource: "@AcmeDemoBundle/Controller/SecuredController.php"
    type:     annotation

_demo:
    resource: "@AcmeDemoBundle/Controller/DemoController.php"
    type:     annotation
    prefix:   /demo
1 голос
/ 09 августа 2011

Похоже, вы неправильно настроили маршрутизацию.

Проверьте файл routing.yml, если он содержит маршрут по умолчанию для /. Если нет, добавьте один к контроллеру / действию, которое вы хотите запустить.

0 голосов
/ 20 января 2015

Проблема очень меня беспокоит, и вот мое решение: сначала измените строку 21 файла следующим образом:

$kernel = new AppKernel('prod', true);

, затем вы можете получить сообщения о проблемах при просмотре /app.php

на самом деле я сделал эти изменения, чтобы избежать «ошибки 404»:

в appKernel.php: комментарий

$bundles[] = new Acme\DemoBundle\AcmeDemoBundle();

добавить

new Acme\DemoBundle\AcmeDemoBundle()

внизу функции registerBundles();

добавить

# AcmeDemoBundle routes (to be removed)
_acme_demo:
    resource: "@AcmeDemoBundle/Resources/config/routing.yml"

к routing.yml

Мне жаль, что я не знаю, как правильно использовать виджет фрагмента кода, но я надеюсь,Я могу вам помочь.

0 голосов
/ 03 мая 2014

Отказ от ответственности: я совершенно новичок в Symfony.

Исходя из других фреймворков, казалось странным, что вы не можете отключить среду / отладку на основе текущих переменных среды (т. Е. Пути / домена).

Поэтому я переименовал app.php в app_prod.php и обновил app.php до следующего:

<?php

if ($_SERVER['HTTP_HOST'] == 'localhost') {
    require_once 'app_dev.php';
} else {
    require_once 'app_prod.php';
}

Так что, если я запускаю код на своем локальном компьютере, он будет использовать dev, если я запусту его где-нибудь еще, он будет запущен как рабочий. Очевидно, что вы можете добавлять любые проверки, которые вы хотите, проверять пути к файлам промежуточного / производственного / dev вместо имен хостов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...