Почему мой Symfony2 устанавливает 404ing при доступе к app.php?
В Symfony2 при доступе к моему приложению локально через app_dev.php все работает нормально. Однако, когда я обращаюсь к app.php, это 404s:
Oops! Произошла ошибка
Сервер возвратил "404 Not Found".
Что-то сломано. Отправьте нам электронное письмо по электронной почте и сообщите нам, что вы делали это при возникновении этой ошибки. Мы исправим его, как только возможное. Извините за
Ответы
Ответ 1
Свежая установка 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();
}
(+ - строка, которую вы должны добавить, - это строка, которую вы должны удалить)
Ответ 2
У меня была та же проблема, и я просто очистил кеш. php app/console cache:clear --env=prod
Это решило мою проблему.
Не добавляйте атрибут true: $ kernel = new AppKernel ('prod', TRUE);
он активирует режим отладки, и он не рекомендуется для продукта.
Ответ 3
Имела ту же проблему.
на самом деле может быть несколько проблем. но вы должны очистить кеш с помощью команды console в качестве маршрутов кэширования symfony, шаблонов и конфигурации.
Ответ 4
Это обычное кэширование 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
Теперь попробуйте перезагрузить страницу в своем браузере, и вы увидите, что она работает.
Ответ 5
Хорошо, у меня была такая же проблема, и очистка кеша не разрешила его. После часа чтения сообщений, где все говорят "ясный кеш", я решил по-настоящему понять, что происходит. Поэтому я попытаюсь объяснить другим людям, как я (кто только начал). Надеюсь, я не ошибаюсь, и если да, то, пожалуйста, поправьте меня.
Я предполагаю, что вы следуете учебному пособию, где у вас 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
. Мы ничего не говорим о нашей настраиваемой маршрутизации. Это похоже на Framework doesn ' t знать о существовании нашего файла маршрутизации, и это в производственной среде, поэтому добавление последней части routing_dev.yml
в routing.yml
(в ./app/config/
) должно устранить проблему.
После этого очистите кеш и проверьте, работает ли /app.php/random/[number]
. Это должно быть.
Я надеюсь, что это поможет кому-то вроде меня, понимая некоторые основы.
Ответ 6
Когда вы выполняете ответ Антона и все еще получаете ошибку, вы можете попробовать следующее:
В 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
не добавляйте эти строки
_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
Ответ 7
Я должен согласиться с Эндрю.
Превращение второго AppKernel в TRUE просто позволяет получить более четкое сообщение об отладке (и вы можете заметить, что приложение не быстрее, чем ожидалось).
В моем случае он сказал мне, что у меня не было никакого приветственного маршрута, доступного для производства (т.е. routing.yml).
Мне пришлось добавить следующие строки, как описано Misbah, и следовать другим распространенным процедурам, чтобы мое приложение работало на полной скорости.
_welcome:
pattern: /
defaults: { _controller: AcmeDemoBundle:Welcome:index }
Ответ 8
Похоже, что вы неправильно настроили маршрутизацию.
Проверьте файл routing.yml
, если он содержит маршрут по умолчанию для /
. Если нет, добавьте его в контроллер/действие, которое вы хотите запустить.
Ответ 9
Ну, я нашел более простой и быстрый ответ:
первый: $kernel = new AppKernel('prod', TRUE);
В файле app.php.
Затем, на вашем routing.yml(приложение/config/routing one, а не ваш пакет)
просто удалите созданный по умолчанию код после объявления вашей маршрутизации.
_demo:
resource: "@AcmeDemoBundle/Controller/DemoController.php"
type: annotation
prefix: /demo
Необходимо удалить. После этого он работает без проблем!
Ответ 10
измените вашу среду на developmet, для использования маршрутов, сконфигурированных в routes_dev.yml
$kernel = new AppKernel ('dev', true);
Ответ 11
Отказ от ответственности: я совершенно не знаком с 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 файлов вместо имен хостов.
Ответ 12
Проблема беспокоит меня много, и вот мое решение:
Сначала измените строку файла 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"
to routing.yml
Извините, что я не знаю, как хорошо использовать виджет кода,
Но я надеюсь, что смогу вам помочь.