ThinkPHP 5.1.41 路由不生效主因是服务器未将请求转发至 index.php;需确认 Nginx/Apache 重写规则正确传递 $query_string,root 指向 public 目录,开启 url_route_on,并清空 runtime/route/ 缓存。

ThinkPHP 5.1.41 路由不生效,90% 是请求根本没进框架 —— 不是你路由写错了,是 Nginx(或 Apache)没把 /user/list 这类地址转给 index.php 处理。先验证这点:访问 /index.php/user/list 能打开,但 /user/list 报 404?那问题 100% 在服务器配置层。
确认路由功能已开启
检查 config/app.php 中这两项是否为 true:
-
'url_route_on' => true(必须开启,否则所有路由直接跳过) -
'route_complete_match' => true(可选,避免路径前缀误匹配,比如/api不该匹配到/api/v1)
Nginx 配置必须带 $query_string
TP5.1 默认用兼容模式(PATH_INFO + QUERY_STRING 混合),Nginx 的 try_files 必须传参,否则 ?id=123 会丢失:
location / {
try_files $uri $uri/ /index.php?s=$uri&$query_string;
}
常见错误:
立即学习“PHP免费学习笔记(深入)”;
- 第三项写成
/index.php或/index.php?s=$uri(漏掉&$query_string) - 把这段规则写在
location ~ \.php$块里(应放在顶层location /) - 项目部署在子目录(如
/myapp/),但没改重写路径,应为/myapp/index.php?s=$uri&$query_string
检查入口文件与目录结构
确保 Web 服务器的 root 指向的是 public/ 目录(不是项目根目录),且 public/index.php 是唯一入口。如果 root 错设在项目根目录,需在 Nginx 中显式指定:
fastcgi_param SCRIPT_FILENAME $document_root/public/index.php;
同时确认 public/.htaccess(Apache)或 Nginx 规则没有被覆盖、禁用。
清空缓存并验证路由加载
TP5.1 会缓存路由,修改后务必清空:
- 删除
runtime/cache/和runtime/route/全部内容 - 命令行执行
php think route:list,正常应列出你定义的所有路由;若只显示/和/index.php,说明route/route.php根本没被加载 —— 检查文件名是否拼错(必须是route.php,不是route.php.swp或Route.php) - Linux 下注意大小写:控制器类名
IndexController对应文件必须是IndexController.php,方法hello()不能写成Hello()



















