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 本身不解析域名,它只接收已到达的请求。