ThinkPHP域名路由按注册顺序匹配,Route::domain()需在闭包内重新定义所有该域名下的路由,否则不生效;泛域名需显式调用$r->get()等方法;开启url_domain_deploy才能使url()生成对应域名链接;Nginx必须透传Host头。

ThinkPHP 域名绑定后 Route::rule() 不生效?先看匹配顺序
ThinkPHP 的域名路由不是“叠加生效”,而是按注册顺序逐条匹配,一旦命中就终止后续规则。你加了 Route::domain(),但没把原本的 Route::rule() 搬进去,它根本不会被触发。
常见错误现象:http://api.example.com/v1/user 返回 404,但 http://www.example.com/index/index 能正常访问 —— 说明全局路由还在跑,但域名下没定义对应规则。
-
Route::domain()是独立作用域,里面必须重新声明所有该域名下的路由,不能复用根域配置 - 如果用了
Route::any()或Route::resource(),也要写在Route::domain()内部闭包里 - 注意闭包参数:第一个是
$route对象,不是think\Route静态类,别错写成Route::rule()
Route::domain('api.example.com', function () {
Route::rule('v1/:controller/:id', 'api/:controller/read');
Route::resource('v1/user', 'api.User'); // 这样才有效
});
子域名路由和泛域名 Route::domain('*') 的坑
泛域名(Route::domain('*'))会拦截所有未显式声明的子域,但它不自动继承主域名的路由逻辑,且优先级高于未绑定域名的 Route::rule()。
使用场景:多租户 SaaS,每个用户一个子域(如 tenant1.example.com),共用一套控制器逻辑。
- 泛域名闭包内必须显式调用
$route->get()、$route->post()等,不能只写Route::rule() - 若同时存在
Route::domain('api.example.com')和Route::domain('*'),前者优先,后者兜底 —— 但别依赖这个顺序,显式声明更可靠 - 泛域名不支持 HTTPS 自动识别,如果 Nginx 反向代理没透传
Host头,$_SERVER['HTTP_HOST']可能还是localhost,导致匹配失败
URL 生成时 url() 函数不带域名?检查 url_domain_deploy 配置
即使路由匹配成功,url('api.User/read', ['id' => 123]) 默认仍生成相对路径或主域名链接,不会自动拼上 api.example.com —— 这不是 bug,是默认行为。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
性能影响不大,但前端 AJAX 请求容易跨域失败或路径错乱。
- 开启域名部署需设置
'url_domain_deploy' => true在config/route.php中 - 还要配
'url_html_suffix' => ''(否则可能拼出api.example.com/v1/user/123.html) - 如果用了
Route::domain()但没设url_domain_deploy,url()生成的仍是当前请求域名下的地址,哪怕当前是www.example.com,也不会跳转到api.example.com
Nginx 配置漏传 Host 头导致 ThinkPHP 读不到真实域名
这是最隐蔽的失效原因:PHP 层拿到的 $_SERVER['HTTP_HOST'] 是 127.0.0.1:8080 或空,ThinkPHP 根本不知道用户访问的是哪个域名,自然无法匹配 Route::domain()。
典型表现:本地开发一切正常,上线后所有域名路由全挂;var_dump($_SERVER['HTTP_HOST']) 输出异常。
- Nginx 的
proxy_set_header Host $host;必须存在,且不能写成$http_host或硬编码 - 如果用了负载均衡(如阿里云 SLB),确认开启了“传递客户端真实 Host”选项
- Apache 用户注意:启用
mod_proxy时要加ProxyPreserveHost On
复杂点在于,这个错误不会报任何 PHP 异常,只会静默 fallback 到默认路由或 404,排查时容易绕远路去改框架配置。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










