Symfony 2 通过约定模板路径和命名自动区分404与500错误页:需在app/Resources/views/Exception/下创建error404.html.twig和error500.html.twig,确保prod环境、debug关闭、缓存清除,并用createNotFoundException()抛出404以保证状态码正确。

Symfony 2 中区分 404 和 500 错误页面,核心在于利用框架默认的错误模板机制,并确保环境配置与模板路径正确。它不依赖手动注册处理器(如 Flask 的 @errorhandler),而是基于 HTTP 状态码自动匹配视图文件。
模板路径必须严格遵循约定
Symfony 默认从 app/Resources/views/Exception/(Symfony 2.8 及更早)或 app/Resources/TwigBundle/views/Exception/ 加载错误页。你需要按状态码命名模板:
-
error404.html.twig—— 处理所有 404(Not Found)响应 -
error500.html.twig—— 处理所有 500(Internal Server Error)响应 - 也可细化:如
error403.html.twig、error405.html.twig,Symfony 会优先匹配最具体的模板
确保 APP_ENV 和 debug 配置生效
错误页只在非调试模式下显示自定义模板:
- 确认
app.php(生产入口)中设置$kernel = new AppKernel('prod', false); -
app/config/config.yml中twig: debug: false且strict_variables: false - 若
APP_DEBUG=true或运行在dev环境,Symfony 会显示带堆栈的调试页面,而非你写的error404.html.twig
避免缓存干扰,及时清除模板缓存
Symfony 会缓存 Twig 模板,修改错误页后常因缓存不生效:
- 执行
php app/console cache:clear --env=prod - 检查
app/cache/prod/twig/下是否生成了对应模板的编译文件(如error404*.php) - 若权限不足导致缓存写入失败,错误页可能回退到空白或默认提示,需修复
app/cache/和app/logs/目录写权限
验证是否真触发了目标状态码
常见失效原因是“页面显示了错误内容,但状态码仍是 200”:
- 用浏览器开发者工具 → Network 标签,刷新一个不存在的路由,看响应头中
Status是否为404 Not Found - 若返回 200,则说明你的控制器或路由层提前返回了响应(比如没抛出
NotFoundHttpException),或 Nginx/Apache 拦截了错误并返回了自身页面 - 确保控制器中 404 场景使用
throw $this->createNotFoundException();,而非return $this->render('404.html.twig');(后者状态码默认是 200)


















