Laravel路由响应特定二级域名需用Route::domain()在分组最外层声明,如Route::domain('api.example.com')->group(...);domain与prefix正交但顺序关键,本地开发须配hosts文件并避免php artisan serve。

怎么让 Laravel 路由只响应特定二级域名
直接在 Route::domain() 中写死二级域名是最简单也最可靠的方式。Laravel 的路由调度器会在请求进入时比对 Host 头,匹配失败就跳过整组路由——不报错、不 fallback,这点和中间件逻辑完全不同。
常见错误是试图用 Request::getHost() 在闭包里做判断,这会导致路由已注册、逻辑却失效;或者把 domain 配置写在 Route::prefix() 之后,而 Laravel 要求 domain() 必须在 group() 最外层调用。
-
Route::domain('api.example.com')->group(...)✅ 正确 -
Route::prefix('api')->domain('api.example.com')->group(...)❌ 无效,domain()不会生效 - 使用通配符如
'*.example.com'时,必须确保 Web 服务器(Nginx/Apache)已将所有子域流量转发到 Laravel,否则 DNS 或反向代理层就拦截了
Laravel 路由前缀与二级域名如何共存
前缀(prefix)作用于路径,域名(domain)作用于 Host 头,二者正交,可以安全叠加。但顺序和层级决定最终 URL 结构——domain 是路由分组的顶层约束,prefix 是其内部路径基础。
例如想让 admin.example.com/dashboard 和 api.example.com/v1/users 各自独立,不能靠一个全局 prefix 解决,必须拆成两个 domain 分组:
Route::domain('admin.example.com')->group(function () {
Route::prefix('dashboard')->group(function () {
Route::get('/', [AdminController::class, 'index']);
});
});
Route::domain('api.example.com')->group(function () {
Route::prefix('v1')->group(function () {
Route::get('/users', [ApiController::class, 'users']);
});
});
注意:不要在 domain 分组内再套一层 prefix 去模拟子域逻辑(比如用 example.com/admin/...),那不是二级域名,只是路径隔离,SEO、Cookie 作用域、HTTPS 证书覆盖范围都不同。
本地开发时二级域名无法访问怎么办
根本原因不是 Laravel 配置问题,而是 host 文件和 Web 服务器未联动。Laravel 本身不解析域名,它只接收已到达的请求。
- 必须手动在
/etc/hosts(macOS/Linux)或C:\Windows\System32\drivers\etc\hosts(Windows)中添加:127.0.0.1 api.example.com admin.example.com - PHP 内置服务器(
php artisan serve)默认只绑定127.0.0.1:8000,不支持 Host 头匹配,所以domain()在它上面永远不生效;必须换用 Valet、Homestead、Docker 或 Nginx - 使用 Valet 时,运行
valet domain test并执行valet link api才能让api.test可访问;别忘了每次改完 hosts 要清浏览器 DNS 缓存(chrome://net-internals/#dns)
Cookie 和 Session 在多二级域名下怎么共享
Laravel 默认 Cookie Domain 是 null,即精确匹配当前 Host,admin.example.com 和 api.example.com 的 Cookie 完全隔离。要共享,必须显式设置为根域。
修改 config/session.php 中的 domain 项:
'domain' => '.example.com',
注意开头的点号 . 表示“包括所有子域”,这是 RFC 标准要求;如果写成 example.com(无点),现代浏览器会拒绝设置该 Cookie。
同时检查 config/app.php 中的 url 配置是否为 https://example.com,否则生成的密码重置链接等可能带错 Host;跨子域的 CSRF Token 无需额外配置,但确保所有子域都使用同一 APP_KEY,否则加密解密会失败。
真正容易被忽略的是:生产环境 Nginx 的 proxy_cookie_domain 指令必须同步设置,否则反向代理后 Cookie Domain 会被覆盖回原始 upstream 域名。











