Symfony2 的 404 页面由异常处理机制自动触发,无需单独配置路由;只需在指定路径放置命名规范的 error404.html.twig 模板,并确保 prod 环境下启用、dev 环境中禁用 profiler 即可生效。

Symfony2 的 404 错误页面不是靠“单独配置一个路由”来实现的,而是由异常处理机制自动触发的。只要请求找不到匹配路由或控制器抛出 NotFoundHttpException,框架就会渲染你定义好的 404 模板。关键在于模板位置、命名规范和环境配置是否到位。
准备错误页面模板文件
在你的主模板目录下(通常是 templates/ 或 app/Resources/views/,取决于 Symfony 版本),创建标准命名的错误模板:
-
templates/bundles/TwigBundle/Exception/error404.html.twig(推荐,适配 TwigBundle 默认查找路径) - 或旧版路径:
app/Resources/TwigBundle/views/Exception/error404.html.twig
内容可简单如:
<h1>页面没找到</h1><p>抱歉,您访问的地址不存在。</p>
支持使用 Twig 语法、引入 layout、读取全局变量(如 app.request)。
确保开发与生产环境行为一致
Symfony 默认在 dev 环境下显示详细调试页面,prod 下才显示自定义 404。若想在 dev 环境也看到自定义页(便于调试样式),需临时关闭调试:
- 检查
config/packages/dev/web_profiler.yaml中是否启用了 profiler —— 它会拦截 404 并展示调试视图 - 临时注释掉或设
web_profiler: { toolbar: false, intercept_redirects: false } - 清空缓存:
php bin/console cache:clear --env=dev
验证是否生效
直接访问一个肯定不存在的 URL(如 /this-route-does-not-exist),观察返回状态码是否为 404,且页面内容是你写的模板内容。可用 curl 验证:
curl -I http://localhost:8000/xyz
应返回 HTTP/1.1 404 Not Found,而非 500 或重定向。
进阶:按异常类型定制不同页面
除了 error404.html.twig,还可提供:
-
error403.html.twig(权限拒绝) -
error500.html.twig(服务器内部错误) -
error.html.twig(兜底模板,所有未明确指定的错误都走它)
所有模板放在同一目录即可,无需额外配置 —— Symfony 的 Twig 异常渲染器会按状态码自动匹配。


















