thinkphp 8二级域名绑定核心是域名识别+应用层映射,需四步:启用auto_multi_app、在config/app.php配置domain_bind数组(键为完整域名、值为应用名)、可选补充route::domain()路由规则、确保web服务器正确传递http_host头。

ThinkPHP 8 实现二级域名绑定,核心不是改入口文件或复制多套代码,而是靠 域名识别 + 应用层映射。关键一步是启用自动多应用模式并正确配置域名到应用的硬绑定关系,否则路由层的 Route::domain() 无法切换上下文,会导致控制器找不到、404 或语言/中间件错乱。
一、初始化多应用结构
确保项目已进入标准多应用形态:
- 执行
composer require topthink/think-multi-app安装多应用扩展 - 删除根目录下的
app/controller目录(这是触发框架识别多应用的关键动作) - 用命令生成独立应用:如
php think build index和php think build admin,生成app/index/与app/admin/目录 - 每个应用应包含自己的
controller/、route.php、middleware.php和view/
二、配置域名与应用映射
这步必须在 config/app.php 中完成,不是写在路由文件里。缺少它,所有子域名都会 fallback 到默认应用:
- 开启自动多应用:
'auto_multi_app' => true - 配置
domain_bind数组,键为完整域名(含端口),值为对应应用目录名
示例配置:
'domain_bind' => [
'www.example.com' => 'index',
'admin.example.com' => 'admin',
'api.example.com' => 'api',
'localhost:8000' => 'index', // 本地开发需显式写端口
'127.0.0.1:8000' => 'index',
],
注意:www.example.com 和 example.com 是两个不同域名,必须分别配置;HTTPS 不影响匹配,但反向代理后若 HTTP_HOST 变成 127.0.0.1,需在 Nginx 中加 fastcgi_param HTTP_HOST $host;。
三、可选:补充路由级子域名规则
domain_bind 已完成应用分发,Route::domain() 只在该应用内部做路径路由增强,适合精细化控制:
- 在
route/app.php中注册,如:Route::domain('admin.example.com', function () { Route::get('login', 'Index/login'); }); - 支持通配符:
Route::domain('*', function () { ... });匹配未在domain_bind中声明的域名(但建议避免泛用) - 不推荐用它替代
domain_bind,否则仍走默认应用,控制器命名空间错误
四、Web 服务器与本地调试准备
域名绑定依赖 $_SERVER['HTTP_HOST'] 正确传递:
- 本地测试时,在系统
hosts文件添加:127.0.0.1 admin.example.com和127.0.0.1 www.example.com - Nginx 配置需保留 Host 头:
fastcgi_param HTTP_HOST $host; - Apache 确保
.htaccess在public/目录且AllowOverride All已启用 - 伪静态规则必须导向
public/index.php?s=,例如 Nginx:rewrite ^(.*)$ /index.php?s=$1 last;
完成以上四步,访问 admin.example.com 就会自动加载 app/admin/ 下的控制器、中间件和视图,完全隔离于前台逻辑。整个过程不依赖入口文件复制,也不需要手动切换命名空间。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











