Почему мой Symfony2 устанавливает 404 при доступе app.php?
В Symfony2 при локальном доступе к моему приложению через app_dev.php , все работает нормально. Однако, когда я получаю доступ app.php это 404s:
Упс! Произошла ошибка
Сервер вернул сообщение "404 Не найдено".
Что-то сломано. Пожалуйста, напишите нам по электронной почте [email] и сообщите нам, что вы делали, когда произошла эта ошибка. Мы исправим это как можно скорее. Извините за
12 answers
Новая установка 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();
}
(+ - строка, которую вы должны добавить, - строка, которую вы должны удалить)
У меня была та же проблема, и я только что очистил кэш. php app/console cache:clear --env=prod
Это решило мою проблему.
Не присваивайте атрибуту значение true: $ kernel = new AppKernel ('prod', TRUE);
это активирует режим отладки, и это не рекомендуется для prod.
На самом деле может возникнуть несколько проблем. но вы должны очистить кэш с помощью консольной команды, так как symfony кэширует маршруты, шаблоны и конфигурацию.
Это обычное кэширование Symfony, выполняющее свою работу. Любые изменения, которые вы внесете, будут доступны для просмотра/тестирования в app_dev.php (среда разработки), но не в app.php (производственная среда), так как она все кэширует.
Я следую простому правилу, которое работает. Каждый раз, когда я обновляю что-либо в app\config\routing.yml
(или любое изменение на самом деле), и я хочу видеть это в рабочей среде, вам нужно ОЧИСТИТЬ КЭШ , выполнив следующую консольную команду:
Симфония 2.*: php app/console cache:clear --env=prod
Симфония 3.*: php bin/console cache:clear --env=prod
Теперь попробуйте перезагрузить страницу в своем браузере, и вы увидите, что она работает.
Хорошо, у меня была та же проблема, и очистка кэша не решила ее. После часа чтения сообщений, где все говорят "очистить кэш", я решил по-настоящему понять, что происходит. Поэтому я постараюсь объяснить другим людям, таким как я (которые только начали). Надеюсь, я не ошибаюсь, и если да, поправьте меня, пожалуйста.
Я предполагаю, что вы следуете учебнику по книге, где у вас есть 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]
. Так и должно быть.
Я надеюсь, что это поможет кому-то вроде меня понять некоторые основы.
Когда вы следуете ответу Антона и все равно получаете ошибку, вы можете попробовать следующий способ
В 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
Я должен согласиться с Эндрю.
Включение второго ядра приложения в значение TRUE просто позволяет получить более четкое сообщение об отладке (и вы можете заметить, что приложение работает не быстрее, чем ожидалось).
В моем случае он сказал мне, что у меня нет _welcome маршрута, доступного для производства (т.Е. routing.yml).
Мне пришлось добавить следующие строки, как упоминалось Мисбой, и следовать другим распространенным процедурам, чтобы мое приложение работало на полной скорости.
_welcome: pattern: / defaults: { _controller: AcmeDemoBundle:Welcome:index }
Похоже, вы неправильно настроили маршрутизацию.
Проверьте свой файл routing.yml
, содержит ли он маршрут по умолчанию для /
. Если нет, добавьте его в контроллер/действие, которое вы хотите запустить.
Ну, я нашел более простой и быстрый ответ:
первый:$kernel = new AppKernel('prod', TRUE);
На app.php файл.
Затем на вашем routing.yml (приложение/конфигурация/маршрутизация, а не ваш пакет)
просто удалите сгенерированный по умолчанию код после объявления вашего маршрута.
_demo:
resource: "@AcmeDemoBundle/Controller/DemoController.php"
type: annotation
prefix: /demo
Должен быть удален. После этого он теперь работает без проблем!
Измените свою среду на developmet, чтобы использовать маршруты, настроенные в routes_dev.yml
$ядро = новое ядро приложения ('dev', true);
Отказ от ответственности: Я совершенно новичок в 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, если я запущу его в другом месте, он будет работать как рабочий. Очевидно, вы можете добавить любые проверки, которые хотите, проверить наличие пути к файлам staging/production/dev вместо имен хостов.
Эта проблема меня очень беспокоит, и вот мое решение: Сначала измените строку файла 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"
Для маршрутизации.yml
Мне жаль, что я не знаю, как использовать виджет фрагмента кода хорошо, Но я надеюсь, что смогу вам помочь.