问题出在框架加载路径或中间件拦截:需确认config/app.php中'route_config_file'=> 'route.php'是否配置正确,多应用下路由文件路径是否匹配,'url_route_on'=>true和'url_route_must'=>false是否启用,检查中间件重定向、伪静态配置及opcache缓存干扰。

ThinkPHP6项目中路由缓存已清、APP_DEBUG已关、route:list也显示新规则,但访问URL仍跳转到旧控制器或返回404,说明请求根本没走你刚定义的路由——问题出在框架加载路径或中间件拦截上。
确认路由文件是否被真正加载
打开 app/config/app.php,检查 【'route_config_file' => 'route.php'】 这一行是否存在且未被注释。TP6默认不读取 app/route.php,必须显式指定该配置项;若此处写的是 'route/app.php' 或根本没这行,你改再多 route/app.php 也没用。
运行 php think route:list,如果输出里完全没有你新增的路由,说明文件压根没执行——此时不是缓存问题,是加载路径错误。
多应用模式下,检查实际访问的模块名是否匹配路由文件位置:访问 /admin/user/list 时,框架会优先加载 app/admin/route/app.php,而不是根目录下的 app/route/app.php。
检查 URL 路由开关与强制模式
在 config/app.php 中确认两项布尔值:
'url_route_on' => true(路由功能必须开启)
'url_route_must' => false(若为 true,所有请求包括 /static/css/app.css 都要匹配路由,不匹配直接 404)
若 'url_route_must' => true 且你没给静态资源单独放行,浏览器加载 CSS/JS 失败后可能触发前端 JS 跳转逻辑,让你误以为“路由跳到了旧地址”——其实只是资源加载失败后页面脚本执行了 window.location.href。
排查中间件重定向干扰
第一步:在 app/middleware.php 中搜索关键词 redirect、location、301、302、old_domain、example.com,逐行检查是否有中间件对请求做了硬编码跳转。
第二步:临时注释掉所有自定义中间件,只保留系统默认中间件,再测试路由是否生效。若恢复正常,说明某个中间件在路由解析前就发起了 header('Location: ...'),导致请求根本没进路由分发流程。
第三步:重点检查跨域中间件、HTTPS 强制跳转中间件、域名白名单中间件——这些常含类似 if ($_SERVER['HTTP_HOST'] !== 'new.example.gov.xx') { header('Location: http://old.example.com'); exit; } 的逻辑,且容易被忽略。
验证入口与伪静态是否错位
方法一:绕过伪静态,直接用完整 URL 访问
例如你期望 /user/profile 生效,先尝试访问 http://localhost/index.php/user/profile。若能正确响应,说明问题出在服务器重写规则,而非 TP6 路由本身。
方法二:检查 public/.htaccess(Apache)或 nginx.conf(Nginx)是否仍将请求错误地转发给了旧入口文件,比如仍指向 /v3/index.php 而非当前项目的 public/index.php。
注意:Linux 系统下文件名大小写敏感,public/.htaccess 若被误命名为 Public/.Htaccess,Apache 将完全忽略它,导致所有带 / 的 URL 都 404。
检查 PHP 缓存扩展干扰
某些生产环境启用了 opcache 且未设置 opcache.revalidate_freq=0,会导致 app/route/app.php 文件修改后,PHP 进程仍从 opcache 中读取旧字节码。此时即使清空 runtime/route/、删掉所有缓存目录,路由逻辑仍是旧的。
临时解决:在 public/index.php 开头加入 opcache_invalidate(__DIR__.'/../app/route/app.php', true);,确认后再在 php.ini 中调高 revalidate 频率或上线后重启 PHP-FPM。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











