ThinkPHP 6.0 域名路由必须写在 route/app.php 中,第二参数须为闭包或数组,本地开发需匹配完整 HTTP_HOST(含端口),泛域名需显式声明并配合服务器通配配置。

在 ThinkPHP 6.0 中配置域名路由,核心是使用 Route::domain() 方法,并确保写在正确的文件位置、满足语法与运行环境要求。它不是靠配置项开关或中间件实现,而是路由解析阶段的硬性匹配机制。
必须写在 route/app.php 文件中
域名路由规则只能定义在 app/route/app.php(单应用)或对应子应用的 app/xxx/route/app.php(多应用)中。其他位置如 config/route.php、app/middleware.php、控制器里调用 Route::domain() 均无效。
- 框架只在入口路由加载阶段扫描该文件中的
Route::domain()调用 - route/route.php 是闭包专用路由文件,不支持域名分组
- 多应用模式下,各应用的域名路由仍需各自定义在其 own app/route/app.php 中
正确写法:闭包或数组作为第二参数
Route::domain() 的第二个参数必须是闭包函数或返回路由定义的数组,不能是字符串路径。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- ❌ 错误:
Route::domain('api.example.com', 'api/v1.User/index'); - ✅ 正确(闭包):
Route::domain('api.example.com', function () {
Route::get('v1/user', 'api.v1.User/index');
Route::post('v1/login', 'api.v1.Login/login');
}); - ✅ 正确(数组):
Route::domain('m.example.com', require 'route/mobile.php');(mobile.php 必须return [])
本地开发注意 HTTP_HOST 匹配细节
ThinkPHP 直接读取 $_SERVER['HTTP_HOST'] 进行比对。本地用 php -S 启动时,HOST 值常为 localhost:8000 或 127.0.0.1:8080,和 api.example.com 不一致,导致路由失效。
- 开发时可显式写完整 host:
Route::domain('localhost:8000', [...]) - 更推荐加环境判断:
if (env('APP_DEBUG')) {
Route::domain('localhost', [...]);
} - 泛域名(如
*.example.com)需 Web 服务器已做 DNS 解析,且 TP 不自动通配,要写成Route::domain('{name}.example.com', [...])并捕获参数
Web 服务器必须统一指向 public/index.php
ThinkPHP 本身不监听多个域名,依赖 Nginx/Apache 将不同域名请求都转发到同一入口文件。
- Nginx 示例中,
server_name api.example.com;和server_name www.example.com;的root都必须指向项目/public目录 - Apache 的
VirtualHost中DocumentRoot也需一致,并启用mod_rewrite - 若为两个 server 块分别指向不同 root,API 域名请求根本不会进入 TP,直接 404 或返回静态文件
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










