You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 20:15:02