thinkphp域名路由必须写在route/app.php中且开启url_domain_deploy配置,route::domain()第二参数只接受闭包或数组,本地开发需正确配置hosts和web服务器透传host,泛域名用*且须置于精确规则之后。

ThinkPHP 域名路由必须写在 route/app.php 中才生效,其他位置(比如 config/route.php、app/middleware.php 或控制器里)写的 Route::domain() 全部无效。
必须开启 url_domain_deploy 配置
TP5 默认关闭域名路由识别,不开启就静默失效,连错误都不报。在 config/app.php 里确认有这一行:
'url_domain_deploy' => true,
注意不是 route_domain_bind(那是 TP6 的配置项),也不是 APP_SUB_DOMAIN_DEPLOY(那是子域名模块绑定用的,和路由无关)。
常见现象:写了 Route::domain('admin', ...),但访问 admin.example.com 仍进 index 模块——八成是这里漏配了。
Route::domain() 第二个参数不能是字符串
很多人照搬普通路由写法:Route::domain('admin', 'admin/index/index'),这会直接报错 Invalid route rule。
它只接受两种形式:
- 闭包函数(推荐):里面可以写
Route::get()、Route::group()、甚至MISS路由 - 路由定义数组(如从外部文件
require进来)
正确示例:
use think\facade\Route;<br>Route::domain('admin.example.com', function () {<br> Route::get('/', 'admin.Index/index');<br> Route::get('user/:id', 'admin.User/read');<br>});
如果想复用已有路由文件,可以:Route::domain('m.example.com', require 'route/mobile.php');,但确保 mobile.php 返回的是数组。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
本地开发时 Host 匹配要写全
内置服务器(php think run)或 Apache 本地环境,$_SERVER['HTTP_HOST'] 往往是 localhost:8000 或 127.0.0.1:8080,而你写的 Route::domain('admin.example.com') 根本不匹配。
解决办法有两个:
- 改
hosts文件,加127.0.0.1 admin.example.com,然后浏览器真用这个域名访问(不要输端口) - 开发时临时加一条宽松规则:
Route::domain('localhost', [...])或Route::domain('admin.test', [...]),配合 hosts 绑定更稳
Nginx/Apache 必须透传原始 Host:fastcgi_param HTTP_HOST $host;(不能写成 $server_name),否则框架拿到的是服务器名,不是用户访问的真实域名。
泛域名和通配符要小心顺序与写法
Route::domain('*') 是唯一支持的泛匹配写法,Route::domain('*.example.com') 无效。
它必须放在所有精确域名规则之后,否则会提前截断,导致 admin.example.com 也进了泛匹配分组。
另外,* 不匹配主域名(即 example.com),只匹配一级子域名。若需覆盖主域名,得显式加一条:Route::domain('example.com', [...])。
最后提醒一句:URL 生成函数 url() 默认不带域名,要生成完整链接得手动加参数:url('admin.Index/index', [], true, 'https://admin.example.com'),或者封装一个带域名的辅助函数——这点容易被忽略,直到邮件通知链接点不开才发现。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










