yii2 rest路由成功运行需三要素:开启enableprettyurl、showscriptname设为false、enablestrictparsing设为true;yii\rest\urlrule必须置于rules末尾且controller值严格按小写无命名空间斜杠分隔(如['v1/user']);还需配置json解析器以支持post/put请求。

Yii2 REST 路由能跑起来,核心就三件事:开启美化 URL、把 yii\rest\UrlRule 放对位置、控制器类名和路由规则严格对齐——漏一条,/v1/users 就 404。
urlManager 必须启用的三个开关
缺一不可,且顺序/值敏感:
-
'enablePrettyUrl' => true:关闭后所有请求强制带index.php前缀,REST 规则压根不触发 -
'showScriptName' => false:否则 Nginx/Apache 重写失效时 fallback 到index.php/v1/users,走默认路由而非 REST -
'enableStrictParsing' => true:设为false会导致自定义规则(如'v1/' => 'site/index')吞掉 REST 请求,/v1/users直接 404
yii\rest\UrlRule 的 controller 值怎么写才不 404
它不是路径,也不是命名空间,而是控制器类名的「小写、去命名空间、斜杠分隔」映射:
- 控制器是
api\modules\v1\controllers\UserController→ rule 写['v1/user'] - 控制器是
api\controllers\OrderController→ rule 写['order'](不是['api/order']或['Api/Order']) - 复数化默认开启:模型叫
User,自动匹配/users;若想用/user,得加'pluralize' => false - 必须放在
rules数组末尾:前面有'v1/<action>' => 'site/<action>'</action></action>这类通配规则,会提前拦截,yii\rest\UrlRule根本没机会执行
POST/PUT 请求返回 400 或空响应?先查 JSON 解析器
Yii2 默认只解析 application/x-www-form-urlencoded,JSON body 会被静默丢弃:
- 在
components['request']中加:'parsers' => ['application/json' => 'yii\web\JsonParser'] - 前端发请求时必须带 header:
Content-Type: application/json - 调试用 curl:
curl -X POST -H "Content-Type: application/json" -d '{"name":"test"}' http://localhost/v1/users - 如果同时要支持 XML,还得额外装
ext-simplexml,否则启动报错:Class 'SimpleXMLElement' not found
OPTIONS 预检请求失败不是 CORS 配置问题
浏览器发跨域请求前会先发 OPTIONS,但 yii\rest\ActiveController 不自动注册该动作:
- 要么在控制器里显式声明:
public $verbs = ['index' => ['GET', 'HEAD', 'OPTIONS']] - 要么全局配置 CORS 行为,在
as cors中确保'Access-Control-Allow-Methods' => 'GET, POST, PUT, DELETE, OPTIONS' - 别只配
Access-Control-Allow-Origin就以为万事大吉——OPTIONS 没路由匹配,照样 404
最易被忽略的是 enableStrictParsing 和规则顺序的耦合关系:它让 Yii 只认明确配置的规则,但也意味着你写的每条自定义规则都可能成为 REST 路由的“拦路虎”。











