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

如何通过Laravel路由系统将所有路由重定向至新子域名?

Laravel主域名重定向至子域名的内部实现方案

要在Laravel内部实现主域名到子域名的全路由重定向,最直接的方式是通过自定义中间件处理所有请求,判断来源域名后完成跳转,以下是具体步骤:

1. 创建自定义重定向中间件

首先生成中间件文件:

php artisan make:middleware RedirectToSubdomain

打开app/Http/Middleware/RedirectToSubdomain.php,编写重定向逻辑:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class RedirectToSubdomain
{
    public function handle(Request $request, Closure $next): Response
    {
        // 配置主域名和目标子域名
        $mainDomain = 'mydomain.com';
        $targetSubdomain = 'subdomain.mydomain.com';

        // 跳过本地开发环境,避免影响调试
        $localHosts = ['localhost', '127.0.0.1', '::1'];
        if (in_array($request->getHost(), $localHosts)) {
            return $next($request);
        }

        // 检测当前请求是否来自主域名
        if ($request->getHost() === $mainDomain) {
            // 拼接完整的子域名URL,保留原请求的路径和查询参数
            $newUrl = sprintf('https://%s%s', $targetSubdomain, $request->getRequestUri());
            
            // 用301永久重定向(利于SEO优化),临时重定向可改用302
            return redirect()->to($newUrl, 301);
        }

        return $next($request);
    }
}

2. 注册中间件

全局生效(所有请求都重定向)

打开app/Http/Kernel.php,将中间件添加到$middleware数组中:

protected $middleware = [
    // ... 已有的其他中间件
    \App\Http\Middleware\RedirectToSubdomain::class,
];

仅指定路由生效

如果只需要部分路由重定向,先在$routeMiddleware中注册别名:

protected $routeMiddleware = [
    // ... 已有的其他路由中间件
    'redirect.subdomain' => \App\Http\Middleware\RedirectToSubdomain::class,
];

然后在路由文件(如routes/web.php)中给目标路由组添加该中间件:

Route::middleware('redirect.subdomain')->group(function () {
    // 这里放置需要重定向的路由
    Route::get('/page/{id}', [SomeController::class, 'show']);
    // ... 其他路由
});

3. 注意事项

  • HTTPS协议:代码中直接使用https://,如果你的环境仍用HTTP,可改为http://,或通过$request->getScheme()动态获取协议。
  • 301 vs 302:永久重定向(301)适合域名永久迁移场景,能帮助搜索引擎更新索引;临时重定向(302)用于临时跳转场景。
  • .env配置优化:可以把主域名和子域名放到.env文件中,方便后续修改:
    MAIN_DOMAIN=mydomain.com
    TARGET_SUBDOMAIN=subdomain.mydomain.com
    
    然后在中间件中读取:
    $mainDomain = env('MAIN_DOMAIN');
    $targetSubdomain = env('TARGET_SUBDOMAIN');
    

内容的提问来源于stack exchange,提问作者mahdi samian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 07:53:15