先确认请求是否进入ThinkPHP框架:访问/index.php/route/test,若见ThinkPHP调试页则框架已接管,否则请求未进框架;再执行php think route:list检查路由是否加载;接着验证Nginx try_files或Apache .htaccess伪静态配置;最后确认config/app.php中'url_route_on'=>true及环境变量未覆盖。

先确认请求有没有真正进入 ThinkPHP 框架——这是最核心的判断点,90% 的 404 问题卡在这一步。
看响应头和页面类型
直接在浏览器访问一个肯定不存在的路径,比如 http://yourdomain.com/index.php/route/test(确保 route/test 没定义任何路由):
- 如果看到 ThinkPHP 黄色调试页,提示「找不到路由」,说明框架已启动、路由系统在运行,问题出在路由定义或匹配环节;
- 如果返回 Nginx 或 Apache 原生的 404 页面,且响应头里没有 X-Powered-By: ThinkPHP,那就不用往下查路由代码了——请求根本没走到 index.php,框架连初始化都没发生。
验证路由是否实际加载
在命令行执行:
php think route:list
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
立即学习“PHP免费学习笔记(深入)”;
- 输出为空,或列表里压根没有你写的
/user/profile,说明app/route.php没被执行; - 此时可在
app/route.php第一行加die('route loaded');,刷新任意 URL,没输出就证明该文件被跳过; - 常见原因包括:文件被误删、改名、内容为空或只含注释、多应用下 controller 目录残留导致降级失效。
检查服务器重写配置是否生效
如果带 index.php 能访问(如 /index.php/user/list),但去掉后 404,就是伪静态没起作用:
-
Nginx:确认
location /块内有且仅有一条try_files $uri $uri/ /index.php?$query_string;;缺$query_string会导致 GET 参数丢失; -
Apache:检查
public/.htaccess是否存在、全小写、内容正确,且对应目录的<Directory>配置中启用了 AllowOverride All; - 宝塔、AMH 等面板用户别只点“伪静态”下拉菜单,要手动打开配置文件确认规则已写入并重载服务。
确认基础开关是否开启
检查 config/app.php 中:
-
'url_route_on' => true—— 路由功能必须打开,否则所有路由定义都无效; -
'url_route_must' => true—— 强制路由模式,未匹配则直接 404(适合生产环境,避免 URL 解析绕过路由); - 再检查
.env文件,确认没有APP_URL_ROUTE_ON=false这类环境变量覆盖了配置。


















