ThinkPHP 5 域名绑定后控制器返回404,主因是请求未抵达框架路由层;需先验证是否进入index.php(访问/index.php/index/index并检查X-Powered-By头),再排查Web服务器根目录配置、.htaccess或Nginx try_files规则、PATH_INFO支持及路由开启状态。

ThinkPHP 5 域名绑定后访问控制器返回 404,大概率不是路由写错了,而是请求压根没进到框架的路由层——此时改 route/route.php 或控制器方法名都没用,得先确认 Web 服务器是否把请求正确交给了 index.php。
验证请求是否抵达 ThinkPHP 入口文件
直接在浏览器访问 http://your-domain.com/index.php/index/index(确保该控制器方法存在)。如果看到正常页面,说明框架能跑;如果仍 404,且响应头里没有 X-Powered-By: ThinkPHP,那问题出在 Web 服务器配置上,别动 PHP 代码了。
用 curl -I http://localhost/index.php/index/index 快速验证:有 X-Powered-By 头才继续排查;只有 Server: nginx 或 Server: Apache,说明 PHP 进程根本没执行。
- Apache 用户:检查
public/.htaccess是否存在、全小写、内容为标准重写规则,且对应Directory块中启用了AllowOverride All - Nginx 用户:确认
server块里root指向的是项目public/目录,不是项目根目录 - 宝塔用户:进【网站】→【设置】→【网站目录】→【运行目录】,必须选
/public(开头带斜杠),改完点【保存】再【重启】
检查域名绑定是否触发了错误的入口路径
ThinkPHP 5 默认从 public/index.php 入口。如果你把域名直接绑到项目根目录(比如 /var/www/your-project/),而没把文档根目录设为 public/,那么访问 http://your-domain.com/index/index 实际会去找 /var/www/your-project/index/index.php —— 物理路径不存在,Nginx/Apache 直接返回 404。
立即学习“PHP免费学习笔记(深入)”;
- Linux 下用
ls -l /var/www/your-project/public/index.php确认入口文件存在 - Apache 的
DocumentRoot必须是/var/www/your-project/public - Nginx 的
root配置值必须是/var/www/your-project/public,不能漏掉/public - 检查
public/index.php第 12 行左右的define('APP_PATH', __DIR__ . '/../application/');,确保上层路径能正确定位到application/目录
确认路由是否被加载且控制器可访问
执行 php think route:list,输出为空或没列出你写的 index/index,代表 route/route.php 根本没被执行。此时在该文件第一行加 die('route loaded');,刷新任意 URL,没中断就说明该文件被跳过。
- 检查
config/app.php中'url_route_on' => true是否开启 - 确认控制器类名和文件名大小写一致:Linux 下
Index.php和index.php是两个文件,IndexController类必须放在Index.php里 - 控制器方法必须是
public,不能是protected或private - 若使用模块(如
admin),确保域名绑定时没漏掉模块前缀,或在路由里显式声明模块
注意 Nginx 的 PATH_INFO 兼容性问题
ThinkPHP 5 默认使用 PATH_INFO 模式解析 URL(如 /index.php/Index/Index/index),但部分 Nginx 配置不默认支持,尤其旧版或精简版环境。如果去掉 index.php 后能访问,但带上就 404,很可能卡在这儿。
在 Nginx 的 location ~ \.php$ 块中,必须包含这两行:
fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_param PATH_INFO $fastcgi_path_info;
缺一不可。漏掉 fastcgi_split_path_info,$fastcgi_path_info 就是空,PATH_INFO 传不进去,框架收不到控制器和方法信息,直接判为 404。
这个点容易被忽略——因为很多教程只贴 try_files,却没提 PATH_INFO 支持,而 TP5 的 URL 解析强依赖它。



















