Symfony 5项目访问不存在路由时如何重定向到首页而非报错页
Symfony 5 404请求重定向到首页配置方案
下面提供两种常用实现方式,可根据自己的需求选择:
方法1:配置兜底路由(无代码侵入,实现最快)
该方案不需要编写业务代码,仅需修改路由配置即可生效:
- 打开项目下的
config/routes.yaml文件 - 在所有路由配置的最底部添加如下内容:
app_404_redirect: path: /{path} controller: Symfony\Bundle\FrameworkBundle\Controller\RedirectController::urlRedirectAction defaults: path: / permanent: false # 设为true时返回301永久重定向,默认false返回302临时重定向 requirements: path: .*
注意:路由匹配是从上到下按优先级生效的,必须把该配置放在路由文件最底部,否则会覆盖正常的业务路由。
方法2:异常事件监听器(灵活度高,可扩展额外逻辑)
如果需要在跳转前做额外处理(比如记录404请求日志、统计访问来源等),可以使用该方案:
- 第一步:执行命令生成事件订阅器
php bin/console make:subscriber NotFoundSubscriber - 第二步:打开生成的
src/EventSubscriber/NotFoundSubscriber.php文件,替换为如下代码:
<?php namespace App\EventSubscriber; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpKernel\Event\ExceptionEvent; use Symfony\Component\HttpKernel\KernelEvents; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; class NotFoundSubscriber implements EventSubscriberInterface { private UrlGeneratorInterface $urlGenerator; public function __construct(UrlGeneratorInterface $urlGenerator) { $this->urlGenerator = $urlGenerator; } public function onKernelException(ExceptionEvent $event): void { $exception = $event->getThrowable(); // 判断是否为404异常 if (method_exists($exception, 'getStatusCode') && $exception->getStatusCode() === 404) { // 此处app_home请替换为你项目实际的首页路由名 $redirectUrl = $this->urlGenerator->generate('app_home'); $event->setResponse(new RedirectResponse($redirectUrl, 302)); } } public static function getSubscribedEvents(): array { return [ KernelEvents::EXCEPTION => 'onKernelException', ]; } }
注意事项
- 开发环境(APP_ENV=dev)下Symfony默认会展示调试用的错误页,要测试重定向效果请将
.env文件中的APP_ENV改为prod,并执行php bin/console cache:clear清除生产环境缓存。 - 301永久重定向会被浏览器长期缓存,测试阶段建议使用302临时重定向,确认逻辑无误后再调整为301。
内容的提问来源于stack exchange,提问作者Seikyoo
相关产品推荐
相关产品推荐

