Yii2路由404主因是请求未进框架或PATH_INFO为空、urlManager失效、视图路径错误;须先区分Web服务器拦截还是Yii抛NotFoundHttpException,再依次排查入口执行、Nginx fastcgi_split_path_info配置、前后端urlManager分离及视图目录位置。

Yii2 路由 404 不是代码写错了,而是请求压根没进框架,或进了但 PATH_INFO 为空、urlManager 没生效、视图路径错——得先分清是 Web 服务器拦的 404,还是 Yii 自己抛的 NotFoundHttpException。
先确认请求是否真进了 Yii
直接访问 /index.php/product/index(带 index.php):
- 能打开 → 说明 Yii 运行正常,问题出在 URL 重写或
urlManager配置上 - 打不开 → 请求没进 PHP,查 Nginx/Apache 是否转发到
index.php、PHP-FPM 是否运行、index.php权限是否可读、vendor/autoload.php是否存在 - 在
index.php开头加file_put_contents('/tmp/yii-enter.log', $_SERVER['REQUEST_URI'], FILE_APPEND),看日志有没有写入,确认脚本是否执行
Nginx 的 fastcgi_split_path_info 必须配对
这是 Linux/Nginx 环境下最常漏的项,缺了它 $_SERVER['PATH_INFO'] 就是空的,Yii 收不到 /product/123 这段路由,只能看到 /index.php。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- location 块里必须有:
fastcgi_split_path_info ^(.+\.php)(/.+)$; - 紧跟着必须有:
fastcgi_param PATH_INFO $fastcgi_path_info; -
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;—— 用$document_root,别用$realpath_root,后者在符号链接或 Windows 下容易越权或路径错 - 检查 Nginx error log:出现
Primary script unknown或Permission denied,基本就是SCRIPT_FILENAME指向了错误路径
urlManager 配置和前后端必须分离
高级模板里前后端共用一份 urlManager 是 404 高频原因。前端(web)和后端(console/API)的路由规则不能混用。
- 确保
'enablePrettyUrl' => true且'showScriptName' => false同时生效 - 前端配置在
frontend/config/main.php,后端在backend/config/main.php,不要复用同一份数组 - REST 接口要额外确认:
rules里有没有匹配api/*的规则,比如'api/<controller:>/<id:>' => '<controller>/view'</controller></id:></controller:>;注意正则中\w+不匹配中划线,要用[\w\-]+ - 模块化 API 推荐用独立模块:在
modules中注册'api' => ['class' => 'app\modules\api\Module'],再在模块内配自己的urlManager
视图目录位置错一个层级就 404
Gii 生成的 CRUD 视图文件不是放在 views/layouts/,也不是 views/site/,必须严格按控制器名建子目录。
-
ProductController→ 视图必须放在views/product/目录下 - 文件包括:
index.php、view.php、_form.php等,不能少,也不能放错路径 - 常见误操作:把
views/product/整个挪到views/layouts/product/,结果 Yii 找不到product/index视图,直接抛 404 - Windows 下注意大小写:虽然文件系统不敏感,但 Yii 的视图解析器区分大小写,
ProductController对应的是views/product/,不是views/Product/
真正卡住人的地方,往往不是某条配置写错了,而是 PATH_INFO 没传进来却去调 controller 名、或是 urlManager 配了两套却只改了一处、又或者视图目录看着对,实际被 IDE 自动挪进了 layouts —— 这些细节不打日志、不看 $_SERVER、不手动测 /index.php/xxx,根本没法定位。


















