laravel 子域名跳转需动态配置 app_url 并设置路由 domain,同时将 session.domain 设为 '.example.com' 以共享会话;本地需 hosts 绑定并清缓存验证。

在 Laravel 中跳转到子域名页面时,如果直接用 route() 或 url() 生成链接,会默认指向当前域名,导致跳转失败或跨域错误;必须让框架感知并使用目标子域名生成 URL。
确保 APP_URL 动态适配当前请求
打开 config/app.php,找到 'url' 配置项,将其改为运行时读取:
【'url' => env('APP_URL', request()->getSchemeAndHttpHost()),】
这一步是基础前提。若仍用硬编码如 'https://example.com',所有 route()、url()、asset() 都会忽略 Host 头,永远无法生成子域名链接。Laravel 不会自动推断你想要跳去 admin.example.com,它只忠实地返回 APP_URL 的值。
生成带子域名的跳转链接
方法一:用 url() 手动拼接完整地址(适合简单跳转)
在控制器或 Blade 中调用 url('login', [], true, 'https://admin.example.com'),第三个参数 true 表示强制生成绝对 URL,第四个参数指定完整目标域名。
方法二:用 route() 并配合 domain 参数(推荐,保持命名路由优势)
先在 routes/web.php 顶部定义子域名路由组:
Route::domain('admin.example.com')->group(function () {
Route::get('/login', [AuthController::class, 'showLogin'])->name('admin.login');
});
然后在任意位置调用:
route('admin.login', [], true)
注意:true 参数表示生成绝对 URL,此时 Laravel 会自动提取该命名路由绑定的 domain,并组合出 https://admin.example.com/login —— 这依赖于上一步 APP_URL 的动态配置,否则协议部分可能丢失。
跨子域名跳转时共享会话和 Cookie
第一步:修改 config/session.php 中的 domain 配置
将 'domain' => null 改为 'domain' => '.example.com'
第二步:确认 .example.com 已被浏览器接受为合法 Cookie 域名
【必须以点号开头,且主域名需真实存在 DNS 解析】 否则 Cookie 不会被发送到 admin.example.com 或 shop.example.com,导致跳转后用户状态丢失。
本地开发时验证跳转是否生效
第一步:在 /etc/hosts(macOS/Linux)或 C:\Windows\System32\drivers\etc\hosts(Windows)中添加:
127.0.0.1 admin.example.com
127.0.0.1 shop.example.com
第二步:清空路由缓存
执行 php artisan route:clear
第三步:启动内置服务器并访问 http://admin.example.com/login,观察是否正确加载对应控制器,且页面内生成的跳转链接(如 {{ route('admin.dashboard') }})指向 admin.example.com 而非 localhost。











