Symfony默认仅在dev环境显示调试页面,prod环境需自定义错误页:在templates/bundles/TwigBundle/Exception下创建error404.html.twig等模板,含{{ status_code }}和{{ status_text }};可通过kernel.exception监听器或继承ErrorController实现逻辑定制;务必关闭prod环境twig.debug并清缓存验证。

当Symfony应用抛出未捕获的异常时,默认显示的调试页面只在dev环境可见,生产环境会返回简陋的空白页或500状态码——你需要为不同HTTP状态码(如404、500)提供美观、品牌一致的自定义错误页面。
创建基础错误模板文件
在templates/bundles/TwigBundle/Exception目录下新建对应状态码的Twig模板,例如error404.html.twig和error500.html.twig。这个路径是Symfony约定的默认查找位置,无需额外配置即可生效。
模板内容可自由编写HTML+Twig,但必须包含{{ status_code }}和{{ status_text }}变量,它们由Symfony自动注入。
覆盖默认异常处理逻辑
方法一:使用kernel.exception事件监听器
创建服务类src/EventListener/ExceptionListener.php,实现EventSubscriberInterface,在onKernelException方法中根据$event->getThrowable()类型或响应状态码重定向到自定义路由或直接设置响应内容。
方法二:替换默认的ErrorController
继承Symfony\Component\HttpKernel\Controller\ErrorController,重写showAction方法,在其中判断$statusCode并渲染对应模板:return $this->render("errors/error{$statusCode}.html.twig", ["status_code" => $statusCode, "status_text" => Response::$statusTexts[$statusCode]]);
【必须在config/packages/twig.yaml中启用debug: false才能看到自定义页面】否则开发环境下始终显示调试堆栈。
为不同环境启用不同策略
第一步:在config/packages/prod/twig.yaml中确保debug: false已设置;
第二步:在config/packages/dev/twig.yaml中保留debug: true,避免干扰开发调试;
第三步:运行php bin/console cache:clear --env=prod清空生产环境缓存,否则修改后的错误页不会生效;
第四步:用curl -I http://localhost/not-exist-path验证返回头是否为404且响应体包含你写的HTML结构——这是唯一能绕过浏览器缓存确认真实输出的方式。


















