thinkphp 6/8 实现二级域名访问需三步:启用'url_domain_deploy'=>true、用route::domain()绑定子域名与应用(如'admin'=>'admin')、确保web服务器正确传递http_host头。

ThinkPHP 6 或 8 实现二级域名访问,关键不是改入口文件或复制多套代码,而是让同一套程序根据访问的子域名(如 admin.example.com、api.example.com)自动加载对应的应用模块。整个过程分三步走:确认多应用结构已就位、开启框架域名识别、在路由中绑定子域名规则,并确保 Web 服务器正确传递 Host 头。
一、先搭好多应用基础结构
二级域名绑定的前提是项目已按多应用方式组织。若还没做,需完成以下动作:
- 执行
composer require topthink/think-multi-app安装多应用扩展 - 删除根目录下的
app/controller目录(这是触发框架进入多应用识别的关键操作) - 用命令创建独立应用,例如:
php think build admin、php think build api,生成app/admin/和app/api/等目录 - 每个应用内应有自己完整的
controller/、route.php和中间件配置,实现物理隔离
二、开启域名部署并注册子域名规则
在 config/app.php 中启用域名识别功能:
- 设置
'url_domain_deploy' => true(注意:TP6/8 已废弃APP_SUB_DOMAIN_DEPLOY,别再用)
接着,在 route/app.php(推荐)或 app/common/route.php 中注册绑定关系:
use think\Route;-
Route::domain('admin', 'admin');→ 访问admin.example.com自动加载app/admin/ -
Route::domain('api', 'api');→api.example.com对应app/api/ -
Route::domain('*', 'index');→ 其他未匹配子域名(含www.example.com、example.com)默认走app/index/
左侧是子域名(支持通配符),右侧是 app/ 下的目录名,不写控制器或方法,整个应用被完整加载。
三、Web 服务器必须正确转发 Host 头
Nginx 或 Apache 若没传真实 Host,框架就无法识别子域名,所有请求都会落到默认应用。常见配置要点:
-
Nginx:在
server块中确保server_name包含泛解析(如server_name ~^(?<sub>.+)\.example\.com$;</sub>)或显式列出子域名;同时检查fastcgi_param HTTP_HOST $host;是否存在且未被覆盖 -
Apache:启用
mod_rewrite,并在.htaccess或虚拟主机配置中确保AllowOverride All已开启,且重写规则能将请求准确导向public/index.php - 本地开发调试时,可用
var_dump($_SERVER['HTTP_HOST'])查看实际接收到的 Host 值,再与配置比对
四、避开几个高频坑
很多配置失败不是逻辑错,而是细节疏漏:
-
domain_bind.php在 TP6/8 中已不主导子域名绑定,它主要用于单应用下的「域名→模块」映射,多应用下请勿依赖它 - HTTPS 和带
www的域名要单独处理:www.example.com与example.com是两个不同 Host,需分别绑定或用*统一兜底 - 泛域名(如
*.example.com)需 DNS 泛解析 + Web 服务器支持,框架层仅靠Route::domain('*')不足以支撑全部场景,复杂业务建议配合中间件动态解析 - 若使用中间件做子域名预处理(如提取商户名),务必把它放在
app/middleware.php全局队列最前面,确保在路由匹配前执行
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











