域名绑定必须在route/route.php中用Route::domain()定义,不可在中间件或控制器中动态判断;需开启url_domain_deploy配置才能使url()函数生成带域名的URL。

ThinkPHP 域名绑定路由时,domain 配置写在哪?
域名绑定必须在路由定义阶段完成,不能靠中间件或控制器里动态判断。ThinkPHP 的 route.php 是唯一生效位置,且只在应用初始化时加载一次。
常见错误是把域名逻辑塞进 app/middleware.php 或控制器构造方法里——那只是“识别域名”,不是“绑定路由”,会导致 URL 生成、重定向、资源定位全部失效。
-
route/route.php中用Route::domain()显式声明,例如Route::domain('api.example.com', function () { ... }); - 子域名通配用
Route::domain('{name}.example.com', ...),但注意{name}会作为参数注入,需在闭包内接收 - 不支持在
config/route.php数组配置中直接写domain键——那是旧版(5.0)写法,6.x+ 已废弃
多域名共用同一套路由规则,怎么避免重复写?
别复制粘贴路由闭包。ThinkPHP 没有“跨域名路由继承”语法,但可以用变量引用 + 分组复用实现逻辑统一。
核心思路:把路由定义抽成函数或变量,再分别传给不同 Route::domain() 闭包。
立即学习“PHP免费学习笔记(深入)”;
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 定义一个闭包变量:
$commonRoutes = function () { Route::get('user/:id', 'User/read'); }; - 然后分别绑定:
Route::domain('admin.example.com', $commonRoutes);和Route::domain('shop.example.com', $commonRoutes); - 如果某域名需要额外路由,再单独追加:
Route::domain('api.example.com', function () use ($commonRoutes) { $commonRoutes(); Route::rule('v2/:id', 'Api/v2'); });
Route::group() 和 Route::domain() 能嵌套吗?
能,但顺序和层级很关键:必须先 domain,再在闭包里用 group,反过来会失效。
错误写法:Route::group(['domain' => 'xxx'], ...) —— 这个 domain 配置项在 6.x+ 完全被忽略,不会报错但也不起作用。
- 正确结构:
Route::domain('manage.example.com', function () { Route::group(['prefix' => 'admin'], function () { Route::get('list', 'Admin/list'); }); }); - 注意:group 的
prefix只影响路径前缀,不影响域名;域名由外层domain()独立控制 - 如果 group 内部又调用
Route::domain(),会覆盖外层,变成子域名嵌套,慎用
URL 生成时,url() 函数怎么自动带对域名?
默认不带。ThinkPHP 的 url() 只拼路径,除非你显式启用域名生成,且路由已绑定域名。
两个前提缺一不可:一是该路由必须定义在某个 Route::domain() 闭包内;二是配置 url_domain_deploy 为 true,且 url_html_suffix 等不影响解析。
- 开启域名 URL 生成:
config('url.url_domain_deploy', true);(通常放config/app.php) - 调用时指定路由名:
url('admin/index')才能命中 domain 绑定的路由;用url('index/index')这种控制器/操作写法会退化为当前请求域名 - 调试技巧:打印
Route::rules()查看路由是否带domain键,没有就说明绑定失败
真正容易被忽略的是:路由绑定域名后,Request::domain() 返回的是当前请求的原始域名,和路由匹配无关;而 Url::build() 是否带域名,只取决于路由定义时有没有 domain 上下文以及 url_domain_deploy 开关。这两者常被混为一谈。


















