Symfony2在生产环境中出现错误500而不是404的问题

27

在我的Symfony2项目中,我在开发模式下正确地获得了404异常屏幕。但是在生产模式下,我得到的是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

我遇到了类似的问题。你是如何解决的? - Marijn Huizendveld
11个回答

15

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


5
我有类似的问题,但它是由 is_granted('IS_AUTHENTICATED_FULLY') 引起的 - 仅在我的 404 页面上,我的 403 页面可以正常加载。你能提供一些见解吗? - Nick
1
@Routy,你已经得到了答案,但忘记在这里提及它了 :) - coviex

10

如果在生产环境中(app.php)即使您已定义自定义错误页面(例如app / Resources / TwigBundle / views / Exception / error404.html.twig),仍然出现500错误/空白页的最可能原因是您的错误模板调用了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之前,请检查用户是否已登录。例如:

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


5
在我的情况下,是在404模板中使用了{% stylesheets %}标签,而TwigBundle没有包含在Assetic配置中。
请检查你的app/logs/prod.log文件,它应该有答案。

4

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

这可能是缓存问题(80%的情况下,都是缓存问题。请在预生产服务器上尝试rm -rf app/cache/*)。由于该问题在本地不会出现...(你在本地试过"prod"环境了吗?

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


1
非常感谢...我花了一天时间解决同样的问题(500而不是404),原来是app/cache/的问题。 - nolazybits

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')

2

Stack Overflow肯定出错了。我记得这个答案,但绝对不是针对这个问题的! - ihsan

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

0

我遇到了一个问题,当你不使用

时,Symofny 3在生产环境中会抛出500错误。
$this->createNotFoundException()

在你的控制器中。

throw Exception('message', 404)

在开发环境中运行正常,但在生产环境中无法运行。


0

0

可能是app/Resources/TwigBundle/views/Exception/error.html.twig引用了另一个不存在的基础布局模板 - 这就是我的问题所在


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接