子域名路由必须用 domain 参数声明,支持通配符如 '{sub}.example.com' 并需在闭包或控制器中接收变量;本地需配置 /etc/hosts;多域名下 app_url 应动态设为 request()->getschemeandhttphost();session cookie 共享需设 session.domain 为 '.example.com'。

子域名路由必须用 domain 参数声明,不能只靠 Route::group
很多人试过把子域名写在 Route::group(['prefix' => 'api']) 里,结果访问 api.example.com 404——因为 Laravel 的路由匹配默认只看路径,不看 Host。真正起作用的是 domain 路由参数,它会强制校验 HTTP 请求头里的 Host 字段。
-
domain值支持通配符,比如'{sub}.example.com',但注意:通配符变量名(如{sub})必须在路由定义中显式使用,否则拿不到值 - 如果用了
{sub},对应路由闭包或控制器方法的参数里就得接收它,比如function ($sub) { ... } - 本地开发时,
/etc/hosts必须加多行映射,例如:127.0.0.1 admin.example.com api.example.com shop.example.com,否则浏览器根本发不出带正确 Host 的请求
Laravel 多域名共存要避免 APP_URL 硬编码
当多个域名(比如 example.com、cn.example.com、blog.example.com)指向同一个 Laravel 应用时,APP_URL 如果写死成 https://example.com,会导致 route()、asset()、邮件链接等生成错误域名。Laravel 不会自动感知当前请求域名,得靠运行时解析。
- 推荐在
config/app.php里把'url' => env('APP_URL', request()->getSchemeAndHttpHost()),让url()函数动态取当前请求的协议+Host - 如果用了 CDN 或反向代理(比如 Nginx 传了
X-Forwarded-Host),需确保TrustProxies中间件已配置好可信 IP,否则request()->getHost()可能返回代理内网地址 - 生成绝对 URL 的地方(如 API 返回跳转链接、邮件模板)务必用
url('path')而非拼接字符串,避免漏掉 HTTPS 切换或子路径前缀
Route::domain() 和中间件组合时,注意中间件执行顺序
子域名路由常配合中间件做隔离,比如给 admin.example.com 加权限检查。但如果你把中间件写在 Route::domain(...)->middleware(...) 外层,它会在路由匹配前就执行——此时 $request->route() 还是 null,request()->host() 虽然可读,但中间件逻辑容易和域名耦合过紧。
- 更稳妥的做法是:先用
Route::domain('{sub}.example.com')匹配,再在中间件里用$request->route('sub')拿子域名值做分支判断 - 不要在中间件里硬写
if ($request->host() === 'admin.example.com'),这样改域名就得改代码;优先走路由参数提取 - 如果中间件需要提前拒绝非法子域名(比如禁止
hack.example.com),可以在中间件里用正则校验$request->host(),但记得放在handle()开头,避免后续逻辑误执行
HTTPS + 子域名下 Cookie 共享容易漏掉 domain 配置
多个子域名共享登录态时,Session Cookie 默认只发给精确匹配的 Host。比如用户在 admin.example.com 登录,Cookie 的 Domain 属性若为 admin.example.com,那么访问 api.example.com 就不会带上该 Cookie,导致反复登录。
- 在
config/session.php中设'domain' => '.example.com'(注意开头的点),这样所有子域名都能读写这个 Cookie - 如果用了 Redis 或数据库驱动 Session,光改 Cookie domain 不够,还要确保
session.driver是共享的(比如别一个用 file,一个用 redis) - 本地开发用
.test或.localhost域名时,Chrome 120+ 已禁用不带点的localhost的 Cookie domain 设置,必须用.test并配好/etc/hosts
子域名和多域名看着只是改个 Host,但涉及路由匹配、URL 生成、Cookie 作用域、HTTPS 证书覆盖范围,每个环节都可能断在看不见的地方。










