ThinkPHP路由404主因是请求未进入框架:先访问/index.php/route/test,若返回原生404且无X-Powered-By头,说明Web服务器未将请求交予index.php;此时应排查服务器重写配置、root路径、.htaccess权限及try_files规则,而非修改路由代码。

ThinkPHP路由404,八成不是你写错了路由,而是请求压根没进框架——Web服务器直接返回了原生404,index.php都没执行。先确认这一步,再往下调代码,否则全是白忙。
第一步:验证请求是否真正进入ThinkPHP
打开浏览器,访问:
http://your-domain.com/index.php/route/test(确保该路由未定义)
- 看到 ThinkPHP 调试页提示「Route not found」或「找不到路由」→ 框架已接管,问题在路由定义或注册环节
- 返回 Nginx/Apache 原生 404 页面,且响应头里没有 X-Powered-By: ThinkPHP → 请求卡在 Web 服务器层,停在这里,别碰 route 文件
第二步:检查Web服务器是否正确接管请求
Apache 用户:
- 确认 public/.htaccess 存在、全小写、内容含标准重写规则(如 RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L])
- 检查虚拟主机配置中对应
<directory></directory>块是否写了 AllowOverride All(只写 FileInfo 或漏掉这行,.htaccess 就失效)
Nginx 用户:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
立即学习“PHP免费学习笔记(深入)”;
-
root 必须指向 public/ 目录,例如
root /var/www/myapp/public;,不能是项目根目录 -
location /块内必须有:try_files $uri $uri/ /index.php?$query_string;(不是/index.php?s=) -
fastcgi_param SCRIPT_FILENAME必须设为 $document_root$fastcgi_script_name,禁用$request_filename
第三步:确认路由是否被加载和识别
在项目根目录运行命令:
php think route:list- 输出为空,或列表里没有
/user/list→ 路由文件根本没执行 - 在
route/app.php第一行加die('loaded');,刷新任意 URL,没中断 → 该文件被跳过 - 检查
config/app.php中'url_route_on' => true是否被.env覆盖(如APP_URL_ROUTE_ON=false)
第四步:强制路由开启后静态资源也404?
启用 'url_route_must' => true 后,所有请求都走路由匹配,/static/logo.png 也会 404。
- 推荐方案:在
route/app.php顶部添加放行规则Route::rule(':path^.*\.(js|css|png|jpg|gif|svg|woff2|ttf)$', 'static/:path', 'GET', ['ext' => '']); - 务必清除
runtime/cache/下全部缓存,否则旧规则仍生效 - 检查 Nginx 是否有冲突的
location ~* \.(js|css|png)$规则,它会绕过 PHP 直接返回 404


















