Laravel子域名路由未匹配时如何跳转至子域名专属404页面
Laravel子域名路由未匹配时跳转到子域名专属404的解决方案
Laravel路由会按照定义顺序自上而下匹配,当子域名组内没有匹配到对应路径的路由时,会继续匹配后续主域名组的路由,才会出现子域名路径命中主域名路由的问题。
方案1:子域名组内添加兜底路由(推荐)
直接在子域名路由组的末尾添加fallback路由,捕获该子域名下所有未匹配的请求:
// Subdomain routes Route::domain('app.mysite.test')->group(function(){ Route::get('/', function(){ dd("Home page for subdomain"); }); Route::get('/404', function(){ dd("Subdomain 404"); }); //... 其他子域名路由全部放在上方 // 子域名兜底路由,放在当前组最后 Route::fallback(function(){ return redirect('/404'); // 也可以直接返回404响应,不需要跳转,更符合HTTP规范: // return response()->view('subdomain.404', [], 404); }); }); // Top domain routes Route::group(['namespace' => 'Site'], function(){ Route::get('/', function(){ dd("Main site home page"); }); Route::get('/login', function(){ dd("Main site LOGIN page"); }); });
该方案不需要修改框架核心代码,路由规则清晰,后续新增子域名可以独立配置各自的兜底逻辑。
方案2:修改异常处理器统一处理
如果有多个子域名需要统一做404处理,可以修改app/Exceptions/Handler.php的render方法:
public function render($request, Throwable $e) { // 判断是否是404异常且请求属于app子域名 if ($e instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException && $request->getHost() == 'app.mysite.test') { return redirect('http://app.mysite.test/404'); // 同样也可以直接返回404响应 // return response()->view('subdomain.404', [], 404); } return parent::render($request, $e); }
注意事项
- 必须保证子域名路由组的定义顺序在主域名路由组之前
- 子域名内的
fallback路由必须放在该组所有常规路由的最后,避免覆盖正常路由规则 - 如果需要返回正确的404状态码,建议直接返回404响应而非302跳转,更符合HTTP规范,也利于SEO
内容的提问来源于stack exchange,提问作者Gabz
相关产品推荐
相关产品推荐

