生产时Symfony2错误500而不是404

时间:2012-05-03 07:24:14

标签: symfony

在我的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

11 个答案:

答案 0 :(得分:14)

Symfony\Component\Routing\Exception\ResourceNotFoundException表示未定义的路由名称。看起来你的错误模板{{ path('wrong_route') }}中有一处。

答案 1 :(得分:9)

即使您已经定义了自定义错误页面(例如app / Resources / TwigBundle / views / Exception / error404.html),您最有可能在生产(app.php)上获得500错误/空白页面.twig)你的错误模板是调用is_granted twig函数,而不检查用户是否已登录。

调试步骤:

1)检查app / logs / 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之前检查用户是否已登录。 E.g:

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

3)如果在模板中找不到is_granted的引用,请查看KNP菜单包使用的knp_menu_render()调用是否存在。检查任何扩展模板。在检查中包含对knp_menu_render的调用,以验证用户是否已登录:

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

有关详细信息,请查看本页末尾的stof注释: https://github.com/symfony/symfony/issues/5320

答案 2 :(得分:5)

在我的情况下,在404模板中使用了{%stylesheets%}标签,而在Assetic配置中没有包含TwigBundle。

检查您的app/logs/prod.log,它应该有答案。

答案 3 :(得分:4)

ResourceNotFoundException是路由器在没有路由匹配当前请求时抛出的内容。

这可能是缓存问题(80%的情况下,它是缓存。在预生产服务器上尝试rm -rf app/cache/*)。由于问题没有在本地出现......(你在本地试过“prod”env吗?)。

除了简单的HTML之外,你还应该尝试删除app/Resources/TwigBundle/views/Exception/error404.html.twig是你使用的文件名?)中的所有内容,以检查它是否不是问题。

答案 4 :(得分:3)

我有同样的问题,

但我的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')

答案 5 :(得分:2)

以下是将所有不存在的路由重定向到根路径的方法。将此路由条目放在路由配置的最底部。所有现有的路线必须在它之上!

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

答案 6 :(得分:1)

另一个选择是,当没有令牌可用时,您正尝试访问安全上下文中的安全令牌。

答案 7 :(得分:0)

也许app / Resources / TwigBundle / views / Exception / error.html.twig引用另一个不存在的base-layout-template - 这是我案例中的问题

答案 8 :(得分:0)

在我的情况下(symfony 2.3)我收到了200状态代码,因此错误页面没有加载。这就是我解决它的方式:

https://groups.google.com/d/msg/Symfony2/zNWNmQIq3nk/lVs4uC7QMIcJ

答案 9 :(得分:0)

只是对给定答案的补充说明:如果您尝试包含不存在的模板,也可以抛出ResourceNotFoundException。一个典型的情况是,您重构了应用程序代码但忘记更新错误页面,因为它们位于app/Resources而不是src/文件夹中,或者包含使用变量或服务的给定模板未在&#34;错误&#34;中定义的上下文。

答案 10 :(得分:0)

当我不使用

时,我遇到Symofny 3在生产中抛出500错误
$this->createNotFoundException()
控制器中的

throw Exception('message', 404)

适用于开发环境,但不适用于生产。