答案是需安装think-multi-app扩展、删除单应用残留目录、用php think build创建应用、配置hosts映射、Web服务器虚拟主机指向public、在config/app.php中设置domain_bind绑定域名与应用。

你需要让一个ThinkPHP6.0项目同时响应多个域名(如client1.example.com、client2.example.com、admin.example.com),每个域名对应独立应用且不暴露应用路径,这是SaaS型多租户系统上线前最关键的底层配置环节。
安装并启用多应用扩展
进入项目根目录,执行命令安装官方多应用扩展包:
composer require topthink/think-multi-app
安装完成后,TP6会自动识别多应用结构。若app目录下仍只有controller等单应用残留文件,请手动删除app/controller、app/model、app/view等顶层目录——【否则后续域名绑定将失效】。
运行构建命令创建基础应用:
php think build index && php think build admin && php think build api
配置本地域名映射
用记事本(需管理员权限)打开 C:\Windows\System32\drivers\etc\hosts 文件,在末尾新增三行:
127.0.0.1 client1.example.com
127.0.0.1 client2.example.com
127.0.0.1 admin.example.com
注意:不要添加http://或端口号,每行一个域名,保存后无需重启系统,但浏览器DNS缓存可能需刷新(Ctrl+F5)。
Web服务器虚拟主机配置
方法一:Apache(httpd-vhosts.conf)
<VirtualHost *:80>
DocumentRoot "E:/www/tp6/public"
ServerName client1.example.com
ServerAlias client2.example.com admin.example.com
</VirtualHost>
方法二:Nginx(server块)
server {
listen 80;
server_name client1.example.com client2.example.com admin.example.com;
root E:/www/tp6/public;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
}
配置完必须重启Apache或Nginx服务,否则域名解析不会生效。
绑定域名到指定应用
打开 config/app.php 文件,找到 domain_bind 配置项,按以下方式修改:
'domain_bind' => [
'client1' => 'index',
'client2' => 'index',
'admin' => 'admin',
'*' => 'index'
],
这里的关键是:client1.example.com 和 client2.example.com 都指向 index 应用,但它们的请求上下文完全隔离——Session、Cookie、配置文件互不影响;admin.example.com 则强制路由到 admin 应用。
【域名前缀必须与实际二级域名严格一致,不能带点、不能带协议、不能有空格】
验证与调试流程
第一步:在浏览器地址栏分别输入 client1.example.com、client2.example.com、admin.example.com
第二步:观察页面是否正常加载,检查URL地址栏是否仍显示完整域名(而非跳转到 /index.php/admin/index 等路径)
第三步:在各域名下执行 var_dump(app()->getName()),确认返回值分别为 'index'、'index'、'admin'
第四步:访问 client1.example.com/api/test 接口,确认该路由由 app/index/route/app.php 定义,而非全局路由文件
第五步:清空 runtime 目录后重新访问任意域名,确保首次加载不报错——这说明应用自动初始化成功。


















