TP6 多应用模式配置独立域名绑定,需先安装多应用扩展并启用自动多应用模式,推荐通过路由层 Route::domain() 或入口文件 App::bind() 实现,避免仅在 config/app.php 中配置 domain_bind 导致不生效。
先说结论:ThinkPHP6 多应用模式下,域名绑定依赖正确的目录结构、扩展支持及 Web 服务器 Host 头传递,单纯修改配置文件往往不足。
- 适合:需要前后台物理隔离、 session 独立或不同子域名对应不同应用目录的企业级项目。
- 先准备:安装 topthink/think-multi-app 扩展,删除根目录 app/controller 以触发多应用识别,确保 Nginx/Apache 正确传递 HTTP_HOST。
- 验收:访问子域名能加载对应应用下的 route.php,且不会 fallback 到默认应用路由。
命令速用版
composer require topthink/think-multi-app
php think build admin
php think build api为什么会这样
ThinkPHP6 多应用模式本质是在同一框架实例下运行多个逻辑独立的应用,而非传统的模块划分。
框架默认只加载默认应用的路由文件,若未显式指定应用路径或绑定关系,子域名访问会 fallback 到 app/route.php 而非 app/admin/route.php。部分版本中 config/app.php 的 domain_bind 配置在多应用模式下被忽略,必须通过入口文件绑定或路由域名规则显式声明应用映射关系,同时 Web 服务器需确保将域名头正确传递给 PHP 环境。
分步处理
第一步:启用多应用结构
适用场景:新项目初始化或旧项目改造。操作动作:安装扩展并清理目录。验证结果:app 目录下可创建多个独立应用文件夹。风险边界:删除根目录 app/controller 是触发多应用识别的关键,旧控制器需迁移至新应用目录。
composer require topthink/think-multi-app
# 删除根目录 app/controller 目录
# 创建独立应用
php think build admin
php think build index第二步:配置域名绑定规则
适用场景:子域名指向特定应用。操作动作:修改路由文件或入口文件。验证结果:访问 admin.example.com 加载 admin 应用。风险边界:config/app.php 中的 domain_bind 在部分 TP6 版本多应用模式下无效,建议优先使用路由绑定。
方案 A(推荐):在 route/app.php 或 app/common/route.php 中注册:
use think\facade\Route;
Route::domain('admin', 'admin'); // admin.example.com 对应 app/admin/
Route::domain('*', 'index'); // 其他域名对应 app/index/方案 B(入口文件):在 public/index.php 中手动绑定:
if ($_SERVER['HTTP_HOST'] === 'admin.example.com') {
\think\App::bind('admin');
}第三步:Web 服务器配置
适用场景:Nginx 或 Apache 部署。操作动作:配置虚拟主机指向 public 目录。验证结果:$_SERVER['HTTP_HOST'] 能获取到真实域名。风险边界:确保所有子域名解析均指向同一 public 目录,且未拦截 Host 头。
怎么验证是否生效
在目标应用的路由文件(如 app/admin/route.php)开头添加调试代码,访问对应子域名查看是否输出。
// app/admin/route.php
file_put_contents('runtime/admin_route_loaded.txt', 'loaded');
// 或
dump('admin route loaded');检查 runtime 目录下是否生成对应文件,或页面是否输出调试信息。若访问子域名仍加载默认应用路由,说明绑定未生效或 Host 头未正确传递。
常见坑
1. config/app.php 配置不生效:TP6 多应用模式下,'domain_bind' 配置常被忽略,需改用 Route::domain() 或 App::bind()。
2. 路由文件加载错误:每个应用目录下需有独立的 route.php,且内容需以 use think\facade\Route; 开头,否则路由注册失败。
3. Session/Cookie 污染:不同子域名默认不共享 Session,若需共享需配置 cookie_domain 为父域名,但建议多应用保持会话隔离以确保安全。
4. 静态资源路径:多应用模式下静态资源引用路径可能错乱,需确保 HTML 中资源路径基于根目录或配置正确的公共资源目录。
常见问题
config/app.php 里的 domain_bind 为什么没用?
TP6 多应用模式下该配置常被框架忽略,建议改用 route/app.php 中的 Route::domain() 方法或入口文件 App::bind() 进行绑定。
不同应用之间如何共享配置或模型?
多应用共享核心框架库,可将公共配置放在 config 目录,公共模型放在 app/common 目录,各应用通过命名空间调用。
访问子域名报 404 怎么办?
检查 Web 服务器是否将子域名解析到项目 public 目录,确认 HTTP_HOST 头是否传递成功,并检查对应应用目录下是否存在控制器文件。
参考来源
- ThinkPHP 在服务器部署多应用模式_域名区分模块配置实战
- ThinkPHP 6/8 配置二级域名全流程:从入门到多应用绑定【教程】
- TP6 安装和多应用模式部署
- TP6 多应用模式配置