ThinkPHP5.1升级6.0后404主因是请求未进入框架,需三步验证:访问不存在路径看是否返回原生404;在public/index.php加var_dump($_SERVER['PATH_INFO'])确认伪静态;检查config/app.php中app_route、url_route_on为true且url_route_must为false。

ThinkPHP5.1升级到6.0后所有路由访问都返回404,不是代码写错了,而是框架入口、注册方式、缓存机制全变了——旧路由文件压根没被加载,新规则根本没进框架解析流程。
确认路由是否真正进入框架
先别改代码,用三步交叉验证:访问一个绝对不存在的路径(如/xyzabc123),如果返回 Nginx/Apache 原生 404 页面,说明请求连public/index.php都没走到;如果返回 ThinkPHP 自带的 404 模板(含 debug 信息或自定义页面),才证明请求已进框架,问题出在路由层。
在public/index.php顶部加一行:var_dump($_SERVER['PATH_INFO']); die;,然后访问/index/index,输出为空就说明 Web 服务器没传PATH_INFO,伪静态配置失效,后续所有路由注册都白搭。
检查并重置路由核心开关
TP6 默认关闭路由功能,哪怕你写了100条Route::get(),开关关着就等于没写。
立即学习“PHP免费学习笔记(深入)”;
打开config/app.php,确认以下三项均为布尔值true(不是字符串"true",也不是数字1):
【'app_route' => true、'url_route_on' => true、'url_route_must' => false(上线前可设为true,但调试阶段必须false,否则静态资源.css/.js也会404)
多应用模式下,每个子应用(如app/admin/)的config/app.php里也必须单独设置这三项,主应用配置不继承。
迁移路由文件到正确位置并修正语法
第一步:把原route/route.php(TP5格式,返回数组)里的全部路由规则剪切出来;
第二步:新建文件app/route/app.php,顶部必须写use think\facade\Route;,然后逐条改写——原['user/:id'=>'user/read']要改成Route::get('user/:id', 'user/read');;
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
第三步:确保该文件最后一行是return Route::rule();或return Route::group(...)->append();,TP6要求路由文件必须返回think\route\RuleGroup实例,光调用不返回会导致整个文件被忽略。
注意:TP6 不再支持在控制器或闭包里动态调用Route::get(),所有路由必须在app/route/app.php顶层静态注册,否则php think route:cache命令根本不会执行它。
清除并重建路由缓存
① 手动删除整个runtime/route/目录,不要只删里面某个文件;
② 运行命令:php think route:cache --annotation(如果你用了@Route注解,漏掉--annotation参数会导致注解路由完全不生效);
③ 验证结果:php think route:list输出中必须能看到你刚注册的所有路由,如果为空或只有系统默认路由,说明app/route/app.php根本没被执行——检查文件路径、命名空间、是否漏了use think\facade\Route;。
修复Nginx伪静态配置(90%的404根源在此)
方法一(推荐):替换为标准try_files写法,在站点配置的location /块内写:
try_files $uri $uri/ /index.php?$query_string;
方法二:若项目部署在二级目录(如/myapp/),则location必须对应改为location /myapp/,且 fallback 路径为/myapp/index.php?$query_string;
方法三:确认fastcgi_split_path_info ^(.+\.php)(/.+)$;和fastcgi_param PATH_INFO $fastcgi_path_info;这两行真实存在于fastcgi_params区域且未被注释——缺一不可,否则$_SERVER['PATH_INFO']永远为空。
【站点「运行目录」必须设为/public】,这是TP6默认入口,宝塔用户常在这里翻车:根目录设成项目根,却忘了切换运行目录,导致所有rewrite路径偏移一级,/index.php根本找不到。


















