现代 Symfony(4.0+)不再使用 Bundle 目录存放模板,所有 Twig 模板统一放在 templates/ 根目录下;自定义 404 页面应置于 templates/bundles/TwigBundle/Exception/error404.html.twig,且仅在 APP_DEBUG=0 时生效。

Symfony 2 的 Bundles 目录结构已过时,现代 Symfony(4.0+,尤其 5.4/6.x/7.x)**不再使用 Bundle 目录存放模板**,所有 Twig 模板统一放在 templates/ 根目录下。如果你在修改“404模板路径”时遇到 AcmeBundle:Exception:404.html.twig 这类写法报错,说明你正沿用旧版 Bundle 路径约定,而项目实际已是无 Bundle 结构——这是 404 模板不生效的根本原因。
确认当前 Symfony 版本与模板位置
先检查你的项目结构:
- 若存在
src/MyBundle/且templates/目录为空或不存在 → 你可能误用了旧版教程,需迁移 - 若根目录有
templates/,且里面已有base.html.twig或bundles/子目录 → 这是标准现代结构 -
app/Resources/views/已被废弃(Symfony 4+ 移除),该路径下的Exception/404.html.twig不会被加载
正确设置自定义 404 页面(现代 Symfony)
404 属于异常页面,由 Twig 异常模板机制控制,不走常规路由。只需在 templates/ 下放对位置、取对名字:
- 创建文件:
templates/bundles/TwigBundle/Exception/error404.html.twig - 或更通用的兜底写法:
templates/bundles/TwigBundle/Exception/error.html.twig(匹配所有 HTTP 错误码) - 内容可直接继承主布局:
{% extends 'base.html.twig' %},然后写自己的 HTML
无需改配置、无需清缓存(dev 环境实时生效),只要文件存在且路径准确,404 时自动渲染。
常见 404 模板不显示的原因和修复
不是路径写错,就是环境或配置卡住了:
-
开发环境看到白屏或默认 Symfony 错误页:检查是否启用了 debug 模式(
APP_DEBUG=1)。debug 开启时,404 显示的是异常调试页,不是你写的error404.html.twig;只有APP_DEBUG=0时才走自定义模板 -
生产环境仍返回空白或 Nginx/Apache 404:说明请求根本没进 Symfony。检查 Web 服务器是否把所有请求都转发给了
public/index.php(比如 Apache 缺.htaccess,Nginx 缺try_files) -
模板里引用了不存在的块或变量:Twig 渲染失败会退回到默认错误页。建议先写最简内容测试:
<h1>Page not found</h1>
不推荐但兼容旧项目的临时方案
如果你确实维护一个未升级的 Symfony 2/3 项目(含 Bundle),且必须保留 AcmeBundle 结构:
- 模板路径应为:
src/AcmeBundle/Resources/views/Exception/404.html.twig - 命名必须严格为
404.html.twig(不能叫notfound.html.twig) - 确保该 Bundle 已在
AppKernel.php中注册:new AcmeBundle\AcmeBundle() - 运行
php app/console cache:clear(注意是app/console,不是bin/console)
不过强烈建议趁此机会迁移到 templates/ 结构——Bundle 模板路径在 Symfony 6+ 已完全移除支持。


















