ThinkPHP 5.1.41 访问URL报404主因是请求未进入框架:先验证是否触发ThinkPHP(如/index.php/route/test返回框架提示),再排查伪静态配置(Apache需.htaccess+AllowOverride All,Nginx需try_files配?s=模式)、路由注册(php think route:list确认加载)及控制器命名规范(PascalCase类名、public小写方法、Linux大小写敏感)。

ThinkPHP 5.1.41 安装后访问 URL 直接报 404,大概率不是代码写错了,而是请求根本没进到框架里——Web 服务器连 index.php 都没转发过去。先确认是否进入框架,再逐层排查。
第一步:确认请求是否真正进入 ThinkPHP
在浏览器中访问:http://你的域名/index.php/route/test(确保这个路由没定义)。
- 如果看到 ThinkPHP 的调试页提示「找不到路由」或显示「Route not found」,说明框架已启动,问题出在路由配置或重写规则上;
- 如果直接返回 Nginx/Apache 原生 404 页面,且响应头里没有 X-Powered-By: ThinkPHP,那框架根本没运行,问题卡在 Web 服务器层。
第二步:检查伪静态(重写)是否生效
ThinkPHP 5.1 默认依赖重写隐藏 index.php。常见表现是:/ 能打开,但 /index.php/user/list 能通、/user/list 却 404。
-
Apache 用户:确认项目根目录(通常是
public/)下有.htaccess文件,内容类似:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
- 同时检查 Apache 配置中对应目录的
<Directory>块是否设置了 AllowOverride All(不能只写FileInfo或漏掉); -
Nginx 用户:在
location /块内必须有这行:
try_files $uri $uri/ /index.php?s=$uri&$args;
- 注意:TP5.1 使用
?s=模式,不是 TP6 的?$query_string; - 确认
root指向的是public/目录(不是项目根目录),例如:root /var/www/myapp/public;。
第三步:验证路由是否注册成功
在项目根目录执行命令:
立即学习“PHP免费学习笔记(深入)”;
php think route:list
- 如果输出为空,或列表里没有你写的路由(如
/user/list),说明route/route.php没被加载; - 在
route/route.php第一行加<?php die('route loaded'); ?>,刷新任意页面看是否中断——不中断就代表该文件被跳过; - 检查是否误把路由写在了控制器、模型等非路由文件里;
- 清除缓存:
php think clear或手动删掉runtime/cache/下所有文件。
第四步:检查控制器与方法基础要求
TP5.1 对命名和可见性敏感,容易因小细节 404:
- 控制器类名必须是 PascalCase(如
UserListController),对应文件名是UserListController.php; - 方法必须是 public,且命名全小写(如
index()),不能是Index()或INDEX(); - Linux 环境下大小写严格:控制器文件名写成
userlistcontroller.php或方法写成Index(),都会导致匹配失败; - 路由配置中的控制器路径要与实际命名一致,例如:
Route::get('user/list', 'UserList/index');。



















