在我的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
答案 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)
适用于开发环境,但不适用于生产。