ThinkPHP 5.1 域名绑定不生效的核心原因是绑定机制未激活或环境未对齐。必须在 route/app.php 中配置、开启 app_route、清空缓存、闭包内重写全部路由规则,并确保 hosts 和 Web 服务器支持域名解析。

ThinkPHP 5.1 域名绑定不生效,**核心原因不是路由写错了,而是整个绑定机制没被正确激活或环境没对齐**。常见表现是访问 admin.example.com 仍跳到默认首页、404,或始终走主域名逻辑。下面直接说关键设置和避坑点。
必须写在 route/app.php,且开启路由开关
TP5.1 的域名绑定只认 app/route/app.php(单应用)或 app/xxx/route/app.php(多应用),其他位置如 config/route.php 或控制器里调用 Route::domain() 都无效。
- 确认
config/app.php中已开启:'app_route' => true(布尔值,不能是字符串) - 检查该文件顶部有
use think\facade\Route; - 修改后务必清空
runtime/cache/和runtime/route/目录,否则旧缓存会掩盖新配置
域名路由必须闭包内重写全部规则
Route::domain() 是独立作用域,不是“叠加”或“继承”。你在主路由里写的 Route::rule() 对子域名完全无效。
- 错误写法:
Route::domain('admin.example.com', 'admin/index/index')(第二参数不能是字符串) - 正确写法:把该域名下所有接口都放进闭包里重新定义
例如:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
立即学习“PHP免费学习笔记(深入)”;
app/route/app.phpRoute::domain('admin.example.com', function () {
Route::get('login', 'admin.Auth/login');
Route::post('logout', 'admin.Auth/logout');
Route::get('user/:id', 'admin.User/read');
// 所有 admin 域名下的路由都要在这里写
});
本地开发必须配 hosts + Web 服务器支持
域名绑定在 PHP 内置服务器(php -S)下必然失效,因为不透传 Host 头。
- Windows:编辑
C:\Windows\System32\drivers\etc\hosts,加一行:127.0.0.1 admin.example.com - Nginx 配置中必须有对应
server_name admin.example.com;,且确保传递了 Host 头:fastcgi_param HTTP_HOST $http_host; - Apache 同理,需配置
VirtualHost并启用ServerName admin.example.com
注意泛域名与精确域名的顺序
如果同时用了 Route::domain('api.example.com') 和 Route::domain('*'),前者优先匹配;但若泛域名写在前面,它会提前拦截所有未声明的子域,导致精确域名规则根本没机会执行。
- 建议把精确域名(如
admin.example.com、api.example.com)放在前面 - 泛域名(
*)仅作兜底,且闭包内必须显式调用$route->get()等方法,不能只写Route::rule() - 通配符不匹配根域名(
example.com),如需支持,要单独再写一条Route::domain('example.com', ...)


















