Laravel 11 中需启用 InitializeTenancyBySubdomain 中间件并配置 SubdomainTenant 模式,确保 tenant_finder 为 SubdomainTenantFinder、domain 字段存纯子域名、中间件置于 web 组最前,且配套泛解析、APP_URL 无子域名、租户库就绪。

在 Laravel 11 中使用 stancl/tenancy 实现子域名租户识别,核心是启用并正确配置 InitializeTenancyBySubdomain 中间件。它会自动从请求 Host 头中提取一级子域名(如 tenant1.example.com → tenant1),再查数据库匹配对应租户,并初始化其上下文(数据库连接、缓存、文件系统等)。
确保已启用 SubdomainTenant 模式
该中间件只在 SubdomainTenant 模式下生效。检查 config/tenancy.php 中的 tenant_finder 配置:
- 必须设为
Stancl\Tenancy\TenantFinders\SubdomainTenantFinder::class - 确认
'domain_columns' => ['domain']与你的Tenant模型中存储域名的字段一致(默认是domain字段) - 若租户表用的是子域名(如存
shop而非shop.example.com),需确保SubdomainTenantFinder的解析逻辑匹配——它默认取 Host 的第一级子域名部分
将中间件注册到 web 组最前端
打开 app/Http/Kernel.php,找到 $middlewareGroups['web'] 数组:
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
- 把
\Stancl\Tenancy\Middleware\InitializeTenancyBySubdomain::class放在数组最开头 - 不能放在全局
$middleware里,否则对 API 路由无效,且可能干扰 session 初始化 - 顺序很重要:必须在
StartSession、ShareErrorsFromSession等依赖租户上下文的中间件之前执行
验证租户模型的 domain 字段是否可匹配
SubdomainTenantFinder 会尝试用提取出的子域名值(如 acme)去查询租户表的 domain 字段。所以:
- 租户记录的
domain值应为纯子域名字符串,例如acme、beta,而不是完整域名 - 如果想支持多级子域名(如
us-west.acme.example.com),需自定义TenantFinder或改用HostnameTenantFinder - 确保数据库中已有对应租户记录,且状态为激活(
is_active = 1,取决于你是否启用了软删除或状态字段)
配套基础配置不能遗漏
子域名识别不是孤立动作,还需几项关键配合:
-
Nginx/Apache 泛解析:Web 服务器必须把所有
*.example.com请求都转发给 Laravel,不能 404 或拦截 -
APP_URL 不含子域名:.env 中设
APP_URL=https://example.com,而非https://tenant1.example.com,否则 URL 生成会错乱 -
hosts 文件或 DNS 测试可用:开发时可在
/etc/hosts加127.0.0.1 tenant1.example.com快速验证 -
租户数据库已创建并可连接:
InitializeTenancyBySubdomain会在识别成功后自动切换连接,前提是租户库存在且凭据正确










