Symfony 2 默认不提供404.html.twig,需手动创建app/Resources/TwigBundle/views/Exception/error404.html.twig并清空prod缓存;仅在app.php(prod环境)下生效,dev环境显示堆栈。

Symfony 2 默认不提供开箱即用的 404.html.twig 模板文件,需要手动创建并放置在正确路径下才能生效。覆盖修改的关键不是“替换”,而是“按约定补全”——只要结构和命名符合 Symfony 错误页查找规则,框架就会自动调用。
确认错误页生效前提
Symfony 2 的错误页面(包括 404)只在 prod 环境 下显示自定义模板;开发环境(app_dev.php)默认展示完整异常堆栈(由 TwigBundle 的调试模板控制),这是正常行为,不是配置失败。
- 确保当前访问的是
app.php入口(例如http://yoursite.com/app.php/nonexistent) - 检查
app/config/config.yml中是否启用 Twig 错误渲染:twig: exception_controller: 'Symfony\Bundle\TwigBundle\Controller\ExceptionController::showAction' - 确认
app.php中环境变量设为'prod',且debug为false
创建标准 404 模板文件
在 Symfony 2 项目中,错误页模板统一放在 app/Resources/TwigBundle/views/Exception/ 目录下(注意大小写和层级)。需手动创建该路径并添加文件:
- 新建目录:
app/Resources/TwigBundle/views/Exception/ - 新建文件:
error404.html.twig(注意:Symfony 2 使用error404,不是404或error.html.twig) - 内容可精简,例如:
<h1>Page Not Found</h1><p>The requested URL was not found on this server.</p>
⚠️ 注意:Symfony 2 不支持 templates/ 下的 errors/404.html.twig 这种现代写法,那是 Symfony 4+ 的约定。
可选:自定义不同环境或 HTTP 状态码
如需区分 dev/prod 行为,或支持其他状态码(如 500),可在同一目录下添加对应文件:
-
error404.html.twig→ 所有环境通用 404 -
error404.txt.twig→ 当请求头 Accept 包含text/plain时返回纯文本 -
error500.html.twig→ 服务器内部错误页 -
error.html.twig→ 兜底模板(匹配所有未明确定义的状态码)
无需额外配置路由或控制器,Symfony 自动按状态码 + 格式后缀匹配。
验证与缓存清理
修改后必须清空 prod 环境缓存,否则旧模板仍被使用:
- 执行命令:
php app/console cache:clear --env=prod --no-debug - 若使用 APC 或 OPcache,请同时重启 Web 服务或刷新 opcode 缓存
- 测试方式:用 curl 或隐身窗口访问一个明显不存在的 URL,确保不带
app_dev.php
如果仍看到 Symfony 默认异常页,请检查 web 服务器是否将请求错误地转发给了 app_dev.php,或 .htaccess / nginx.conf 是否正确重写到 app.php。


















