laravel 8 api子域名路由需web服务器正确转发请求并用route::domain()声明,绑定中间件组时须确保顺序(如auth:sanctum在throttle之后),且必须清缓存;漏任一环节请求均无法进入路由匹配。

要让 Laravel 8 的 API 路由既走子域名(如 api.example.com)又自动套上 auth:sanctum、throttle 等中间件,必须拆解为两个独立但强耦合的环节:Web 服务器先把请求精准转发到 Laravel,Laravel 再用 Route::domain() 声明子域并绑定中间件组——漏掉任一环节,请求根本不会进路由匹配,更别说执行中间件。
第一步:配通 Web 服务器与 hosts,让请求真正抵达 Laravel
打开 /etc/hosts(macOS/Linux)或 C:\Windows\System32\drivers\etc\hosts(Windows),追加一行:127.0.0.1 api.example.com。这一步不做,浏览器访问 api.example.com 时 DNS 解析失败,压根发不出请求。
Nginx 配置里,server_name 必须显式包含该子域名:server_name example.com api.example.com;。若只写 example.com,Nginx 会直接返回 404 或默认欢迎页——这个错误不是 Laravel 报的,你查 log/fpm-error.log 也找不到痕迹。
HTTPS 下必须为 api.example.com 单独配置 SSL 证书,或使用泛域名证书 *.example.com。证书不匹配时,TLS 握手在 Nginx 层就中断,Laravel 连请求头都收不到。
第二步:用 Route::domain() 声明子域名分组
在 routes/api.php 中,不能用 Route::group(['domain' => 'api.example.com']),这是 Laravel 5.2 旧语法,5.3+ 已失效且不报错,路由永远不匹配。
正确写法是:Route::domain('api.example.com')→group(function () { … })。注意:字符串必须是纯域名,不能带 https:// 或 /v1,否则 Host 头比对失败,整个分组形同虚设。
如果要做多租户动态子域(如 tenant1.example.com),改用 Route::domain('{tenant}.example.com'),但后续所有控制器方法签名必须显式接收 $tenant 参数,否则 request()->route('tenant') 返回 null。
第三步:绑定中间件组并确保顺序正确
打开 app/Http/Kernel.php,在 $middlewareGroups 数组里添加一个新组:'api-subdomain' => [EnsureFrontendRequestsAreStateful::class, ThrottleRequests::class . ':api', AuthenticateSession::class]。这里不能塞带参数的中间件如 throttle:60,1,它会被当类名加载而报错 Class does not exist。
回到 routes/api.php,在 Route::domain() 分组内,调用 ->middleware('api-subdomain')。注意:必须写在 group() 括号外,写成闭包里 middleware('api-subdomain') 是无效的。
Sanctum 的 auth:sanctum 中间件必须放在 ThrottleRequests 之后,否则未登录用户也会被计入限流计数器——这是生产环境常见的流量误杀源头。
第四步:验证路由是否生效
运行 php artisan route:list --domain=api.example.com。如果命令报错 “No routes matched”,说明前两步有遗漏;如果列表中 Middlewares 列显示 api-subdomain,但访问时仍 401,检查 APP_URL 是否为 http://example.com——Laravel 默认 URL 生成不继承子域名,需手动干预。
在控制器中获取当前子域:$sub = request()->route('tenant') ?? 'api'。别依赖 $_SERVER['HTTP_HOST'],它可能被代理篡改,而 request()->route() 来自 Laravel 路由解析结果,可信。
最后清空路由缓存:php artisan route:clear。Route::domain() 的匹配逻辑依赖缓存预编译,不清理会导致旧配置残留,改了十遍也不生效。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











