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
4

11 回答 11

15

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

于 2012-05-03T07:39:57.343 回答
10

即使您定义了自定义错误页面(例如 app/Resources/TwigBundle/views/Exception/error404.html.twig ),您在生产 (app.php) 中收到 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 之前检查用户是否已登录。例如:

{% 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

于 2014-03-18T18:38:29.077 回答
5

在我的例子中,它是在 404 模板中使用 {% stylesheets %} 标记,而 TwigBundle 未包含在 Assetic 配置中。

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

于 2014-09-19T03:15:17.937 回答
4

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

这可能是缓存问题(80% 的时间是缓存问题。rm -rf app/cache/*在您的预生产服务器上尝试)。由于问题没有出现在本地......(您在本地尝试了“prod”环境对吗?)。

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

于 2012-12-06T10:25:52.990 回答
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')
于 2017-03-17T12:50:34.543 回答
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

于 2013-06-11T01:27:07.250 回答
1

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

于 2012-12-05T18:03:25.630 回答
0

也许 app/Resources/TwigBundle/views/Exception/error.html.twig 引用了另一个不存在的基本布局模板 - 这是我的问题

于 2013-05-23T13:29:37.213 回答
0

在我的情况下(symfony 2.3)我得到一个 200 状态码,所以错误页面没有加载。我就是这样解决的:

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

于 2013-11-12T21:54:53.197 回答
0

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

于 2016-01-20T10:31:39.977 回答
0

我遇到 Symofny 3 在您不使用时在生产中抛出 500 错误

$this->createNotFoundException()

在您的控制器中。

throw Exception('message', 404)

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

于 2017-11-10T16:21:20.457 回答