symfony 2 自定义404页面需在app/resources/twigbundle/views/exception/下创建error404.html.twig,生产环境(app.php)自动加载该模板,开发环境需关闭调试模式测试,并可通过kernel.exception事件实现json格式404响应。

Symfony 2 默认的 NotFoundHttpException 返回的是一个简洁但较基础的错误页面(通常为“Oops! An Error Occurred”),若想自定义该 404 页面,核心在于覆盖默认的异常模板,并确保 Twig 能正确渲染你的自定义视图。
创建自定义 404 模板
在 app/Resources/TwigBundle/views/Exception/ 目录下新建文件:error404.html.twig(注意:Symfony 2 使用 errorXxx.html.twig 命名约定,而非 exception.html.twig)
- 该路径是 Symfony 2 的标准异常模板查找位置,TwigBundle 会优先加载此处的模板
- 内容可自由编写,例如:
<h1>页面找不到了</h1>
<p>您访问的地址可能已被移除或输入有误。</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/gongju/2491" title="Symfony Linux版"><img
src="https://img.php.cn/upload/zhuanqu/000/000/086/6a5f5ae8906a0613.png" alt="Symfony Linux版" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/gongju/2491" title="Symfony Linux版" class="overflowclass">Symfony Linux版</a>
<p class="overflowclass">Symfony Linux版整理 Symfony CLI 5.17.1 官方下载入口和 Symfony 框架安装配置说明。</p>
</div>
<a rel="nofollow" href="/xiazai/gongju/2491" title="Symfony Linux版" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
<a href="%7B%7B%20path('homepage')%20%7D%7D">返回首页</a>
确保开发/生产环境均生效
Symfony 2 区分环境,需确认模板在对应环境下被读取:
- 开发环境(
app_dev.php)默认显示详细异常堆栈,不会走error404.html.twig;要测试 404 页面,需临时关闭调试模式,或直接访问生产前端控制器(如app.php) - 生产环境(
app.php)自动使用精简异常模板,只要模板存在且命名正确,就会渲染error404.html.twig - 若仍显示默认页面,请清空缓存:
php app/console cache:clear --env=prod
进阶:按格式返回不同 404 页面
如果请求头包含 Accept: application/json,你可能希望返回 JSON 格式的错误响应:
- 重写
AppKernel::registerErrorHandlers()或监听kernel.exception事件 - 在事件监听器中判断
$event->getRequest()->getMimeType('json')或检查Accept头 - 手动设置响应:
$event->setResponse(new Response(json_encode([...]), 404, ['Content-Type' => 'application/json']))
验证是否生效
最直接的验证方式:
- 访问一个肯定不存在的路由,例如
/this-route-does-not-exist - 确保使用
app.php(非app_dev.php)访问 - 查看页面源码或响应状态码确认为 404,且内容为你写的模板










