thinkphp配置二级域名路由分组核心是“先识别、再隔离、后复用”,需同时开启sub_domain_deploy => true和url_domain_deploy => true,并在app/route/app.php中用route::domain()显式定义路由组,禁止嵌套route::group(),复用逻辑应抽离闭包变量,url生成须命名路由并清缓存。

ThinkPHP配置二级域名路由分组,核心在于“先识别、再隔离、后复用”。不是靠拼接URL或硬编码跳转,而是通过框架原生的域名绑定机制 + 路由分组能力,把不同业务域(如后台 admin、API 接口 api、商户前台 shop)在 URL 层就物理分离,同时保持代码逻辑统一维护。
必须开启的关键开关
二级域名路由不会自动生效,以下两项缺一不可:
-
启用子域名部署:在
config/app.php中确保'sub_domain_deploy' => true -
开启域名路由解析:在
config/route.php中设置'url_domain_deploy' => true,否则url()函数无法生成带域名的链接
用 Route::domain() 定义专属路由组
所有二级域名路由必须在 app/route/app.php(单应用)或对应子应用的 route/app.php(多应用)中声明,不能放在中间件或控制器里动态判断。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 显式绑定最稳妥:
Route::domain('admin.example.com', function () { Route::get('dashboard', 'admin/Dashboard/index'); }); - 泛域名需谨慎:
Route::domain('{name}.example.com', function ($name) { ... });会把子域名作为参数注入,适合多租户场景 - 避免嵌套错误:不要在
Route::domain()外层再套Route::group();正确顺序是先domain,再在其闭包内用group加路径前缀
复用路由逻辑,避免重复定义
多个二级域名共用大部分接口时,别复制粘贴整段路由。推荐抽离为变量再复用:
- 定义公共路由闭包:
$apiRoutes = function () { Route::get('user/:id', 'User/read'); Route::post('order', 'Order/save'); }; - 分别绑定:
Route::domain('api.example.com', $apiRoutes);和Route::domain('staging-api.example.com', $apiRoutes); - 需要差异化扩展?在闭包中调用后再追加:
Route::domain('v2.api.example.com', function () use ($apiRoutes) { $apiRoutes(); Route::rule('v2/*', 'Api/v2'); });
URL 生成与缓存注意点
即使路由定义正确,url('user/read') 仍可能输出相对路径——这不是配置漏了,而是三个细节没对齐:
- 路由必须显式命名:
Route::get('user/:id', 'User/read')->name('api.user');,否则url()只按控制器/方法硬拼 - 若用了资源路由或命名空间,需补全:
Route::resource('user', 'User')->namespace('api.v1'); - 每次改完路由,务必执行:
php think route:clear,否则读的是旧缓存
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










