thinkphp5二级域名绑定模块的核心是开启app_sub_domain_deploy并配置app_sub_domain_rules数组,而非route::domain();它在url解析早期依据$_server['http_host']直接切换默认分组,属模块/分组级绑定。

ThinkPHP5 二级域名绑定模块,核心就一条:靠 APP_SUB_DOMAIN_DEPLOY 开关 + APP_SUB_DOMAIN_RULES 数组映射,不是 Route::domain() —— 后者在 TP5.1 里只管路由分组,不接管应用入口。
必须开启 APP_SUB_DOMAIN_DEPLOY 并配对 APP_SUB_DOMAIN_RULES
TP5 的域名绑定是「模块/分组级」的,不是「应用级」。它不依赖路由解析,而是在 URL 解析早期阶段就根据 $_SERVER['HTTP_HOST'] 拆出子域名,直接切换默认分组(DEFAULT_GROUP)和模块路径。
-
APP_SUB_DOMAIN_DEPLOY必须设为1或true,否则整个机制不触发 -
APP_SUB_DOMAIN_RULES是关联数组,键是子域名(不含主域名),值是目标分组名(或带斜杠的模块路径,如'admin'或'Admin/Index') - 主域名(如
example.com)默认走DEFAULT_GROUP,不会自动匹配www;若要www.example.com也生效,得显式写'www' => 'home' - 泛域名用
*,但注意:它只匹配「一级子域名」,*.example.com不支持,'*' => 'index'表示所有未明确定义的子域名都进index分组
APP_SUB_DOMAIN_RULES 常见写法与陷阱
规则数组看似简单,但实际部署时容易因格式、顺序、大小写栽跟头:
- 子域名键名**不带点**:写
'admin',不是'admin.example.com';写'm',不是'm.'或'm.'结尾 - 值可以是字符串(分组名)或数组:
'admin' => ['Admin', 'var=a&flag=1']会把var和flag作为 GET 参数注入请求上下文 - 三级域名需完整写出:
'api.admin'→ 绑定到api_admin分组,不是'admin.api';顺序严格按 DNS 解析结果来 - 本地测试必须改
hosts:Windows 在C:\Windows\System32\drivers\etc\hosts加两行:127.0.0.1 example.com和127.0.0.1 admin.example.com,缺一不可 - Apache/Nginx 必须透传原始 Host:Nginx 要确保有
fastcgi_param HTTP_HOST $host;,不能写成$server_name,否则 TP5 拿不到真实子域名
为什么 Route::domain() 在 TP5 里不适用于模块绑定?
在 TP5 中,Route::domain() 只在当前分组/模块的路由表内生效,它不改变框架的「入口分组」。也就是说:
- 你写了
Route::domain('admin', function(){ ... }),但访问admin.example.com时,框架仍先进入DEFAULT_GROUP(比如index),再尝试匹配该分组下的domain路由 —— 此时根本不会进admin模块 - 除非你同时开启
APP_SUB_DOMAIN_DEPLOY把admin子域名指向admin分组,Route::domain()才会在admin分组内部起作用(比如限定某条路由只在admin.example.com下可用) - 混淆点常出现在文档碎片化场景:TP5 手册里
Route::domain()示例多用于「同一分组下按域名区分路由」,而非「跨分组跳转」——后者必须靠APP_SUB_DOMAIN_RULES
配置后仍 404 或进错模块?优先查这三处
TP5 的域名绑定失败,90% 出现在环境层,而不是代码逻辑:
- 检查
$_SERVER['HTTP_HOST']实际值:在控制器里dump($_SERVER['HTTP_HOST']),确认是admin.example.com而不是localhost或127.0.0.1—— hosts 写错、代理覆盖、Nginx 配置漏掉Host透传都会导致这个 - 确认
config.php中APP_GROUP_LIST包含了你要绑定的分组名,比如'APP_GROUP_LIST'=>'home,admin,api';没列进去的分组,即使规则写了也不会加载 - 留意大小写:Linux 服务器上分组目录名
Admin和配置里的'admin'不匹配就会报错;统一用小写命名分组目录和配置键值最稳妥
真正卡住人的地方,往往不是规则怎么写,而是 HTTP_HOST 没拿到、分组没列进 APP_GROUP_LIST、或者本地 hosts 少写了一行 —— 这些细节不验证,光调代码没用。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











