Symfony自定义错误页需将Twig模板置于templates/bundles/TwigBundle/Exception/目录下,确保APP_ENV=prod、APP_DEBUG=false并清除生产缓存;404、500、403等页面分别对应error404.html.twig、error500.html.twig、error403.html.twig,通用兜底为error.html.twig;403推荐用security.access_denied_handler自定义处理。

直接改 Symfony 错误页面,核心是替换 Twig 模板,不是动 Apache 的 ErrorDocument 或写 PHP 脚本。只要模板路径对、环境配置准、缓存清干净,就能生效。
模板放对位置才能被识别
Symfony 从 templates/bundles/TwigBundle/Exception/ 目录下找错误模板。这是唯一被自动扫描的路径,其他位置(比如 app/Resources/ 或自定义 bundle 里的 views/exception)在 Symfony 4+ 中默认不生效。
- 404 页面:新建
templates/bundles/TwigBundle/Exception/error404.html.twig - 500 页面:新建
templates/bundles/TwigBundle/Exception/error500.html.twig - 通用错误(兜底):新建
templates/bundles/TwigBundle/Exception/error.html.twig - 403 页面(访问拒绝):用
error403.html.twig,或配合安全配置单独处理
确保处于生产环境且调试关闭
开发环境下(APP_ENV=dev 或 APP_DEBUG=true),Symfony 强制显示完整异常堆栈,自定义模板不会出现——这是设计行为,不是配置失败。
- 检查
.env文件:确认APP_ENV=prod且APP_DEBUG=false - 清空缓存:
bin/console cache:clear --env=prod(不要只清 dev 缓存) - 验证是否生效:临时把
error500.html.twig内容改成HELLO FROM CUSTOM 500,再触发一个 500 错误(如故意抛出throw new \Exception();)
让错误页匹配你的网站风格
这些模板本质是普通 Twig 文件,可以像写首页一样使用 {% extends %} 和 {% block %}。
- 继承你项目的主布局:
{% extends 'base.html.twig' %} - 复用导航、页脚等区块:
{% block body %}...{% endblock %} - 获取错误信息:
{{ status_code }} {{ status_text }}显示状态码;{{ exception.message }}在 prod 环境中为空(出于安全),但error404.html.twig可安全使用{{ exception.message }}做友好提示
特殊场景:403 访问拒绝页
403 不总是走 Twig 模板,尤其当由 Security 组件触发时。更可靠的方式是配置自定义拒绝处理器:
- 在
config/packages/security.yaml中添加:access_denied_handler: App\Security\AccessDeniedHandler - 创建该类,实现
AccessDeniedHandlerInterface,返回一个渲染了security/access_denied.html.twig的 Response - 这样能完全控制响应逻辑,比如记录日志、跳转登录页,或统一返回 JSON


















