先说结论
多租户系统最容易乱的地方不是数据,是入口。同一个 IP、同一套代码,要判断"这次请求该出哪个站"。
城市站用 Host 分派,四层优先级:
① city_sites.domain 城市站独立域名(最精确)
② tenant_domains.domain 租户根域名 / 后台域名
③ tenants.root_domain 泛子域
{slug}-{hash}.root → 城市站
admin.root → 租户后台
www.root / root → 门户
④ {tenant}.platform 平台域名下的租户入口
为什么未命中要 404
一个未登记的子域,如果"回落"到门户或第一个站,会出现:
- 搜索引擎把无数错拼域名都当成同一个页面
- 客户绑错域名时,看到的是别人的站
- 无法判断域名到底有没有生效
所以规则是:没登记就是 404,不猜、不回落。
域名唯一性
同一个 Host 只能属于一个租户或站点:
city_sites.domain唯一索引tenant_domains.domain唯一索引- 保存时跨表校验
tenants.root_domain/admin_domain - 根域名与后台域名不能相同
三种链接模式
| 模式 | 例子 | 适用 |
|---|---|---|
| subdomain | kunming-xxx.jamsw.com |
泛解析已配好,推荐 |
| path | /s/kunming-xxx/ |
没有泛解析时的兜底 |
| query | /index.php?r=... |
完全没有 rewrite 的环境 |
线上实际用的是 subdomain:门户 https,城市站 http(泛域名不配证书)。这里有个坑:80 端口不能强制跳 https,否则泛域名会 307 到没有证书的地址,全站打不开。