90% 域名绑定后模块访问不到是 domain() 写法或配套配置错误:必须链式调用 group()/rule(),避免 bind() 与 domain() 叠加前缀;domain() 仅匹配 Host 头纯域名;hosts 与浏览器地址须严格一致;url() 默认不带域名;Nginx 需正确配置 root、入口文件及 PATH_INFO。

域名绑定了但模块访问不到,90% 是 domain() 写法或配套配置没对齐,不是服务器或 DNS 问题。
domain() 必须接 group() 或 rule(),不能单独存在
ThinkPHP 的 domain() 是路由级声明,不是开关。只写 domain('admin.test') 不会生效,框架直接跳过。
- 正确写法必须链式调用:
domain('admin.test')->group('admin')或domain('admin.test')->rule('/', 'admin/index/index') - 如果用了
bind('admin')全局绑定,再在domain()里指定group('admin'),会导致模块前缀叠加(如解析成admin\controller\admin\index),报错Class admin\controller\index does not exist -
domain()参数只认 Host 头里的纯域名,https://admin.test:8080和http://admin.test都能匹配,但admin.test/或http://admin.test/这类带协议/路径的字符串不能写进参数里
本地调试时 hosts 和浏览器地址必须严格一致
开发常用 admin.test 这类无公网解析的域名,但框架只看请求头中的 Host 字段——它从哪来?就从你浏览器地址栏来。
- hosts 文件必须配好:
127.0.0.1 admin.test,且不能漏掉末尾点号(admin.test.在某些系统下会被识别为不同域名) - 浏览器必须访问
http://admin.test/,不能访问http://127.0.0.1:8000/或http://localhost/,否则Host头是localhost,domain('admin.test')根本不触发 - Chrome 地址栏有时会自动补全
www.,记得手动删掉,避免误访www.admin.test
URL 生成不带域名,要手动处理
url() 函数默认只输出路径部分,比如 url('index/index') 返回 /index/index,不会自动拼 https://admin.test。这容易让人误以为路由没生效。
立即学习“PHP免费学习笔记(深入)”;
- 需要带完整 URL 时,得显式传参:
url('index/index', [], true, 'https://admin.test') - 更稳妥的做法是在
config.php中配置'url_domain_deploy' => true,并配合__domain__路由规则(适用于二级域名映射到模块名的场景) - 如果用了
__domain__映射(如'admin' => 'admin'),注意该写法要求url_domain_deploy开启,且不兼容domain()->group()混用
Nginx 配置错误会直接拦截请求,根本到不了路由层
很多“模块不存在”其实是 Nginx 根本没把请求交给 PHP,domain() 压根没机会执行。
- 确认 Nginx 的
root指向的是public/目录,不是项目根目录 - 如果入口是
admin.php而不是index.php,Nginx 的fastcgi_index和index指令必须同步改成admin.php,否则 404 或No input file specified - PATH_INFO 模式下,Nginx 必须正确传递路径信息,否则
$_SERVER['PATH_INFO']为空,框架无法解析/manager/login这类路径 —— 检查 rewrite 规则是否含$1并确保fastcgi_param PATH_INFO已设置
真正卡住的地方往往不在路由写法本身,而在 Host 头是否到达、Nginx 是否放行、入口文件是否被识别这三个环节。先抓包看请求头,再查日志看有没有 fastcgi 错误,比反复改 route.php 有效得多。



















