Yii RESTful接口返回404,首要排查是否请求未进入框架:先访问/index.php/api/users验证入口,若通则为重写规则问题;不通则检查index.php执行、PHP-FPM、权限及urlManager配置(enablePrettyUrl=true且showScriptName=false),并确认Nginx中fastcgi_split_path_info和SCRIPT_FILENAME路径正确。

Yii RESTful接口返回404,先看是不是路由根本没匹配上
绝大多数“接口404”不是代码逻辑错,而是请求压根没进Yii——Web服务器把请求拦在了入口外。重点查 index.php 是否被正确调用,而不是急着翻控制器。
实操建议:
- 直接访问
/index.php/api/users(带index.php),如果能通,说明是重写规则问题;不通则可能是入口脚本权限、PHP-FPM未启动或index.php报错被静默吞掉 - 在
index.php开头加file_put_contents('/tmp/yii-req.log', print_r($_SERVER, 1), FILE_APPEND);,确认REQUEST_URI和SCRIPT_NAME的值是否符合预期(比如是否多出/web或被截断) - Apache 下检查
.htaccess是否生效:运行apache2ctl -M | grep rewrite确认rewrite_module已加载,并在虚拟主机配置中确认<directory></directory>块里有AllowOverride All
urlManager配置错一个参数,整个REST路由就失效
urlManager 是 Yii REST 路由的开关,enablePrettyUrl 和 showScriptName 必须配合 Web 服务器重写规则使用,单独改没用。
常见错误现象:后台 /index.php/admin 能打开,但 /api/users 404——说明 urlManager 没接管 API 请求。
实操建议:
- 确保
'enablePrettyUrl' => true且'showScriptName' => false;若设为true,所有 URL 必须显式带index.php - 检查
'rules'数组里是否包含匹配api/*的规则,例如:'api/<controller:>/<id:>' => '<controller>/view'</controller></id:></controller:>,注意正则边界和大小写(\w+不匹配中划线,需用[\w\-]+) - REST 模块下推荐用模块化路由:
'api' => ['class' => 'app\modules\api\Module'],并在模块内定义urlManager规则,避免主配置臃肿
抛出 NotFoundHttpException 却还是 200 或空白页
这不是异常没抛,而是 Yii 的错误处理器没接住——状态码写了,但响应体没发,或被其他输出提前冲掉。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
使用场景:在 yii\rest\ActiveController::findModel() 里查不到记录时直接 throw new NotFoundHttpException(),这是标准做法;手动调用 setStatusCode(404) 反而容易失效。
实操建议:
- 确认
config/web.php中'errorHandler'组件未被注释或覆盖,且'errorAction'指向有效 action(如'site/error') - 检查是否启用了
'catchAll'配置(常见于开发环境误配),它会拦截所有请求,导致异常根本不会触发 - API 场景下,
actionError中必须判断请求类型:if (Yii::$app->request->getIsJsonp() || Yii::$app->request->getIsAjax()) { return $this->asJson([...]); },否则默认渲染 HTML 错误页,前端收不到 JSON - 绝对不要在
actionError里再throw新异常,会导致无限递归崩溃
Nginx 下 PATH_INFO 解析失败,/api/users 直接 404
Yii 2.x 默认依赖 PATH_INFO 解析路由,Nginx 默认不提供,必须手动拆分并注入,否则 index.php 收到的只是脚本路径,后续路由完全失灵。
性能影响:没配 fastcgi_split_path_info 时,Nginx 会把整个 URI 当作脚本名尝试执行,找不到文件就直接返回 404,连 PHP 解释器都不会调用。
实操建议:
- 在 Nginx 的
location ~ \.php$块中必须包含:fastcgi_split_path_info ^(.+\.php)(/.+)$;和fastcgi_param PATH_INFO $fastcgi_path_info; -
SCRIPT_FILENAME务必用$realpath_root$fastcgi_script_name,不用$document_root——符号链接环境下$document_root会指向链接源路径,导致文件找不到 - 确认
try_files包含$args:try_files $uri $uri/ /index.php?$args;,缺了$args会导致 GET 参数丢失,路由匹配失败
真正卡住的地方往往不在控制器里,而在 Web 服务器传进来的原始路径是否完整、urlManager 是否启用、以及错误处理器有没有被绕过。三者缺一不可,少配一个,throw new NotFoundHttpException() 就只是个不会落地的 throw。


















