Подтвердить что ты не робот

Ошибка Symfony2 500 вместо 404 при производстве

В моем проекте Symfony2 я получаю в режиме разработки корректный экран 404 Exception. Но я получаю пустой экран с кодом статуса HTTP 500 вместо 404 в режиме производства. Я использую собственные шаблоны ошибок, расположенные в app/Resources/TwigBundle/views/Exception. В журнале ошибок apache он создает это сообщение:

PHP Fatal error:  Uncaught exception 'Symfony\\Component\\Routing\\Exception\\ResourceNotFoundException' in /home/test/app/cache/prod/appprodUrlMatcher.php:518\nStack trace:
#0 /home/test/app/cache/prod/classes.php(1025): appprodUrlMatcher->match('/404')
#1 /home/test/app/cache/prod/classes.php(4550): Symfony\\Component\\Routing\\Router->match('/404')
#2 [internal function]: Symfony\\Bundle\\FrameworkBundle\\EventListener\\RouterListener->onKernelRequest(Object(Symfony\\Component\\HttpKernel\\Event\\GetResponseEvent))
#3 /home/test/app/cache/prod/classes.php(3777): call_user_func(Array, Object(Symfony\\Component\\HttpKernel\\Event\\GetResponseEvent))
#4 /home/test/app/cache/prod/classes.php(3703): Symfony\\Component\\EventDispatcher\\EventDispatcher->doDispatch(Array, 'kernel.request', Object(Symfony\\Component\\HttpKernel\\Event\\GetResponseEvent))
#5 /home/test/app/cache/prod/classes.php(4787): Symfony\\Component\\EventDispatcher\\EventDispatcher->dispatch('kernel.request', Object(Symfony\\Component\\HttpKernel\\Event\\Get in /home/test/app/cache/prod/classes.php on line 4560
4b9b3361

Ответ 1

Symfony\Component\Routing\Exception\ResourceNotFoundException означает undefined имя маршрута. Похоже, что у вас есть где-то в вашем шаблоне ошибок {{ path('wrong_route') }}.

Ответ 2

Наиболее вероятная причина, по которой вы получаете 500 ошибок/пустую страницу при производстве (app.php), даже если вы определили страницу пользовательских ошибок (например, приложение /Resources/TwigBundle/views/Exception/error 404.html.twig) заключается в том, что ваш шаблон ошибки вызывает функцию is_granted twig, не проверяя, зарегистрирован ли пользователь.

Шаги для отладки:

1) Проверьте приложение/журналы/prod.log. Вы видите такую ​​ошибку?

request.ERROR: Exception thrown when handling an exception (Twig_Error_Runtime: An exception has been thrown during the rendering of a template ("The security context contains no authentication token. One possible reason may be that there is no firewall configured for this URL.")

2) Если вы видите ошибку, упомянутую выше, посмотрите, можете ли вы найти ссылку на is_granted в своем шаблоне ошибок. Убедитесь, что пользователь вошел в систему перед вызовом is_granted. Например:.

{% if app.user is not null and is_granted('ROLE_ADMIN') %}
<p>Text goes here</p>
{% else %}

3) Если вы не можете найти ссылку на is_granted в своем шаблоне, посмотрите, есть ли вызов knp_menu_render(), который используется в комплекте KNP. Также проверьте любой расширенный шаблон. Завершите вызов knp_menu_render в чеке, чтобы проверить, что пользователь вошел в систему:

{% if app.user %}
    {{ knp_menu_render() }}
{% endif %}

Для получения дополнительной информации, просмотрите комментарий по stof в конце этой страницы: https://github.com/symfony/symfony/issues/5320

Ответ 3

ResourceNotFoundException - это то, что маршрутизатор бросает, когда маршрут не соответствует текущему запросу.

Это может быть проблема с кешем (80% времени, это кеш. Попробуйте rm -rf app/cache/* на вашем предварительном сервере). Поскольку проблема не появляется локально... (, вы пытались локально "prod" env?).

Вы также должны попытаться удалить все из вашего app/Resources/TwigBundle/views/Exception/error404.html.twig (это имя файла, которое вы используете?), за исключением простого HTML, чтобы проверить, не проблема ли это.

Ответ 4

В моем случае это было использование тега {% stylesheets%} в шаблоне 404, в то время как TwigBundle не был включен в конфигурацию Assetic.

Проверьте app/logs/prod.log, у него должен быть ответ.

Ответ 5

У меня была такая же проблема,

Но мой isGranted был на стороне php. Поэтому я добавил проверку маркера:

До:

if ($this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')

После:

if ($this->get('security.token_storage')->getToken() && $this->get('security.authorization_checker')->isGranted('IS_AUTHENTICATED_FULLY')

Ответ 6

Другим вариантом является то, что вы пытаетесь получить доступ к токену безопасности в контексте безопасности, когда нет токена.

Ответ 7

Вот как я перенаправляю все несуществующие маршруты на корневой путь. Поместите эту запись маршрута в самую нижнюю часть конфигурации маршрутизации. Весь существующий маршрут ДОЛЖЕН быть на вершине!

anything:
    path:     /{path}
    defaults:
        _controller: FrameworkBundle:Redirect:urlRedirect
        path: /
        permanent: true
    requirements:
        path: ".+"

ссылка:
http://symfony.com/doc/current/cookbook/routing/slash_in_parameter.html
http://symfony.com/doc/current/cookbook/routing/redirect_in_config.html

Ответ 8

возможно app/Resources/TwigBundle/views/Exception/error.html.twig ссылается на другой шаблон макета-макета, который не существует - это была проблема в моем случае

Ответ 10

Просто дополнительная заметка к данным ответам: ResourceNotFoundException также может быть брошен, если вы пытаетесь включить несуществующий шаблон. Типичным случаем является то, что вы реорганизовали свой код приложения, но вы забыли обновить свои страницы ошибок, поскольку они находятся в app/Resources, а не в вашей папке src/ или в том числе заданный шаблон, в котором используется переменная или служба, которая не определена в контексте "ошибки".

Ответ 11

Я сталкиваюсь с тем, что Symofny 3 выдает 500 ошибок в производстве, когда вы не используете

$this->createNotFoundException()

в вашем контроллере.

throw Exception('message', 404)

работает на dev-enviroment, но не на производстве.