根本原因是请求被误判为中央请求而非租户请求,因central_domains未包含当前域名、Route::domain()位置错误、中间件干扰Host头或APP_URL配置含子域名导致域名识别失败。

租户域名访问中央路由时报 Tenant could not be identified,根本原因不是租户没找到,而是请求根本没进租户识别流程——它被当成中央(central)请求处理了。
中央域名必须显式配置且严格匹配
stancl/tenancy 默认只把 config('tenancy.central_domains') 列表里的域名视为中央上下文。如果用 tenant1.example.com 访问本该由 central 路由响应的页面(比如后台登录页),但 tenant1.example.com 不在 central_domains 数组里,包就会尝试按租户模式解析,结果查不到对应租户,直接抛出该异常。
- 检查
config/tenancy.php中'central_domains'是否包含你当前访问的完整域名(含端口,如admin.example.com:8000) - 开发环境若用
localhost或127.0.0.1,必须明确加进去,不能依赖泛域名 - 多个域名要写全,例如:
['admin.example.com', 'cms.local', 'localhost:8000']
Route::domain() 分组位置错误
中央路由必须用 Route::domain() 包裹,并放在 routes/web.php 的最外层或独立 central 路由文件中。如果把它嵌套在某个中间件组、命名空间或条件判断里,Laravel 路由注册阶段可能跳过它,导致请求无法命中 central 分组,转而进入 tenant 路由逻辑。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- 确保 central 路由定义在
routes/web.php顶层,不被任何if、middleware或prefix包裹 - 推荐写法:
foreach (config('tenancy.central_domains') as $domain) { Route::domain($domain)->group(function () { /* central routes */ }); } - 不要在
Route::middleware(['web'])内部再套Route::domain()
中间件顺序干扰了域名识别
某些全局中间件(比如自定义的 HTTPS 强制跳转、Host 校验、CORS)可能在路由匹配前就修改了请求 Host 头,或提前终止了请求,导致后续 Route::domain() 匹配失败。
- 检查
app/Http/Kernel.php的$middleware和$middlewareGroups['web'],把可疑中间件临时注释掉测试 - 特别注意是否在中间件里调用了
$request->setHost()或重写了getHost() - 确认
TrustProxies配置正确,否则反向代理后 Host 头可能丢失
APP_URL 配置破坏了 Host 解析
如果 .env 中 APP_URL 写了带子域名的地址(如 https://tenant1.example.com),Laravel 的 URL 生成器和部分 tenancy 内部逻辑会误判当前上下文,干扰域名路由判定。
-
APP_URL应只写协议 + 主域名 + 端口,不含子域名,例如:https://example.com或http://localhost:8000 - 多租户系统中,
APP_URL是“应用基准地址”,不是“当前租户地址” - 租户专属链接应通过
tenant()->getUrl()等方式动态生成


















