结论:90%是Nginx未正确传递PATH_INFO或未识别admin.php等非默认入口文件;根本原因是URL未进入ThinkPHP路由层,因PATH_INFO为空或入口文件不匹配,导致框架fallback至不存在的index模块。

直接说结论:ThinkPHP5 绑定域名后提示“module not exists: index”,90% 是 Nginx 未正确传递 PATH_INFO,或入口文件(如 admin.php)未被 Nginx 显式识别,不是代码写错了。
为什么绑定域名后突然报“module not exists: index”?
本质是 URL 路径没进到 ThinkPHP 的路由解析层。常见触发场景:
- 你把项目部署到子目录(如
/manager/),但 Nginxroot指向了上层,导致请求被当成静态资源或默认走index.php入口,而实际该入口不处理/manager/login - 你用了独立后台入口
admin.php,但 Nginx 配置里仍只认index.php,fastcgi_index index.php这一行没改 - 你开了 pathinfo 模式,但 Nginx 没配
fastcgi_split_path_info,$_SERVER['PATH_INFO']始终为空,ThinkPHP 只能 fallback 到默认模块index,而它又不存在
Nginx 必须加的三行 pathinfo 配置
在 location ~ \.php$ 块内补全以下配置(缺一不可):
fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param SCRIPT_NAME $fastcgi_script_name;
注意:fastcgi_param SCRIPT_FILENAME 必须用 $document_root$fastcgi_script_name,不能硬写绝对路径;否则 PATH_INFO 传了也白传。
立即学习“PHP免费学习笔记(深入)”;
验证是否生效:在控制器里临时加一行 dump($_SERVER['PATH_INFO']);,访问 yourdomain.com/manager/login,应输出 /manager/login。如果为空,说明上面三行没生效或位置放错(必须在 include fastcgi_params; 之后)。
用了 admin.php 或 manager.php 入口怎么办?
ThinkPHP5 支持多入口,但 Nginx 不会自动猜。你得显式告诉它哪个是 PHP 入口:
- 把
location /块里的index index.html index.htm index.php;改成index index.html index.htm admin.php; - 把
location ~ \.php$块里的fastcgi_index index.php;改成fastcgi_index admin.php; - 确保
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;这行存在且未被覆盖
改完记得 nginx -t && nginx -s reload。别漏掉 reload —— -t 只校验语法,不生效。
还有个容易被忽略的点:URL 中文参数触发“模块不存在”
如果你的路由规则里写了 '__pattern__' => ['name' => '\w+'],那 name=张三 就会直接 404 或跳转到 index 模块,因为正则不匹配,ThinkPHP 路由失败后 fallback 到默认行为。
解决方式只有两个:
- 删掉
'name' => '\w+'这条全局规则(最简单) - 改成支持中文的正则,比如
'name' => '[\x{4e00}-\x{9fa5}\w]+',并确保 PHP 开启了u修饰符(ThinkPHP5 默认支持)
别试图在 Nginx 层 decode URL —— ThinkPHP 自己会处理,问题只出在路由规则拦截太严。
真正卡住人的地方,往往不是框架逻辑,而是 Nginx 把请求截在了 PHP 执行之前,PATH_INFO 没传进去,或者入口文件压根没被选中。先确认 $_SERVER['PATH_INFO'] 和 $_SERVER['SCRIPT_NAME'] 是什么,比翻路由配置快十倍。



















