如何通过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
相关产品推荐
相关产品推荐

