ThinkPHP部署域名绑定步骤详解
作者:技术拾光时间:2026-07-15 19:29:09浏览:647
实现ThinkPHP多应用域名绑定,需要先安装多应用扩展,删除默认的控制器目录,创建各个子应用目录并配置域名绑定数组,在路由配置文件中注册各域名对应的路由规则,同时务必确保Nginx或Apache正确透传主机头。
搞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 中注册域名路由规则
这一步不是可选的,而是必须——只有写在这里,框架才会把域名作为路由解析入口。
- 打开
route/app.php(注意,不是config/route.php或app/common/route.php) - 写入规则,例如:
use thinkRoute;
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'])确认实际收到的值是否与配置一致

