核心问题是请求未进入ThinkPHP路由系统;需先确认Web服务器是否将请求转发至index.php(看响应头有无X-Powered-By: ThinkPHP),再检查app/route/app.php是否执行及路由是否正确定义、未被缓存覆盖。

开启强制路由后报“路由未定义”,核心问题不是路由写得不对,而是请求根本没走到路由匹配环节,或匹配逻辑被绕过。排查要分两层:先确认请求是否进入框架,再检查路由是否真正注册生效。
看响应头和页面特征,判断是否进到 ThinkPHP
直接访问一个明显不存在的路径,比如 /test/abc:
- 如果看到黄色调试页,提示 Route not found 或带 ThinkPHP 标识的错误信息,说明框架已接管,问题出在路由定义本身
- 如果看到纯白屏、Nginx/Apache 原生 404 页面,且响应头里没有 X-Powered-By: ThinkPHP,说明 Web 服务器没把请求转发给
public/index.php,路由系统压根没启动
检查入口是否被正确接管
这是最常被忽略的第一步。常见原因包括:
- Nginx 缺少
try_files $uri $uri/ /index.php?$query_string;,或该规则没写在location /块里 - Apache 的
.htaccess未启用:确认虚拟主机配置中<Directory>块有 AllowOverride All - public 目录没设为网站根目录(误把整个项目根目录当 web root)
- Windows IIS 用户未安装 URL Rewrite 模块,或
public/web.config未生效
快速验证:在浏览器访问 /index.php/test,能打开就说明入口正常,问题在伪静态或重写规则。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
立即学习“PHP免费学习笔记(深入)”;
确认路由文件是否执行、规则是否注册
ThinkPHP6 默认从 app/route/app.php 加载路由,但容易因以下原因失效:
- 忘记在文件开头加 use think\facade\Route;,导致
Route::get()报类找不到 - 路由定义漏了前导斜杠,如写成
Route::get('user/list', ...)(应为'/user/list') - 多应用模式下,路由文件放错位置(比如 admin 应用的路由应放在
app/admin/route/app.php,而非全局app/route/app.php) -
APP_DEBUG = false时,路由被缓存;改完路由后没清runtime/route/目录,旧规则仍在用
可在 app/route/app.php 第一行加 die('route loaded');,刷新页面看是否中断——不中断说明该文件根本没被加载。
强制路由下的特殊陷阱
开启 'url_route_must' => true 后,所有请求都必须显式匹配,包括静态资源:
-
/static/logo.png会 404,因为没定义对应路由;需用Route::alias('static', 'static')或正则规则放行 - 别名必须写在
route/app.php最顶部,否则可能被后续动态路由(如Route::get(':id', ...))提前捕获 - 若用了子域名路由,必须单独注册并开启
'url_domain_deploy' => true,否则主域名下无法匹配 - 仍能通过
?m=index&c=index&a=index访问,说明app_init阶段没拦截 m/c/a 参数,需手动加 input 校验


















