ThinkPHP二级域名绑定需四步协同:一、建好app/admin等目录并删除app/controller;二、在config/app.php启用url_domain_deploy并配置domain_bind数组(键为完整域名);三、在route/app.php用Route::domain()注册闭包路由规则;四、Nginx/Apache透传HTTP_HOST头且root指向public/。

ThinkPHP部署域名绑定,核心是让框架识别访问的域名或子域名,并自动加载对应的应用模块。它不是简单改个配置就能生效,而是需要结构、配置、路由、服务器四者协同。下面分四步讲清楚关键操作和常见踩坑点。
一、搭好多应用目录结构
这是前提,结构不对,后面全白忙。
- 执行composer require topthink/think-multi-app安装多应用扩展
- 删除根目录下的app/controller目录(这是单应用标志,不删框架不会进入多应用模式)
- 用命令创建独立应用:php think build admin、php think build api,生成app/admin/、app/api/等目录
- 每个子应用目录必须包含标准结构:controller/、route.php、config/、middleware.php
- 确认config/app.php中已设置'auto_multi_app' => true且'app_namespace' => 'app'
二、开启域名识别并配 domain_bind
TP6/8 已废弃APP_SUB_DOMAIN_DEPLOY,必须用domain_bind数组做硬绑定,否则无法切换应用上下文。
- 在config/app.php中添加或修改:
'url_domain_deploy' => true,
'domain_bind' => [
'admin.example.com' => 'admin',
'api.example.com' => 'api',
'*' => 'index'
], - 键必须是完整域名(如admin.example.com),不能只写admin;本地开发时若用localhost:8000,就得写'localhost:8000' => 'admin'
- 值必须是app/下的目录名,且该目录存在且结构完整
三、在 route/app.php 中注册域名路由规则
这一步不是可选,而是必须——只有写在这里,框架才会把域名作为路由解析入口。
立即学习“PHP免费学习笔记(深入)”;
- 打开route/app.php(不是config/route.php或app/common/route.php)
- 写入规则,例如:
use think\Route;
Route::domain('admin.example.com', function () {
Route::get('login', 'index/login');
}); - 注意:Route::domain()第二个参数只能是闭包或数组,不能是字符串路径(如'admin/index/login'会报错)
- 泛域名用Route::domain('*', ...),但要放在精确匹配之后
四、Web 服务器正确透传 Host 头
如果 Nginx 或 Apache 没把原始域名传给 PHP,框架连$_SERVER['HTTP_HOST']都拿不到,所有配置都无效。
-
Nginx:server 块里确保有
fastcgi_param HTTP_HOST $host;
且root指向项目public/目录 - Apache:启用mod_rewrite,虚拟主机中设置DocumentRoot为public/,并开启AllowOverride All
- 本地开发时,别忘了改hosts文件,例如加一行:127.0.0.1 admin.example.com
- 调试可用var_dump($_SERVER['HTTP_HOST'])确认实际收到的值是否与配置一致



















