Yii2路由正常运行需满足两个前提:Web服务器将请求重写至index.php,且urlManager中enablePrettyUrl和showScriptName必须同时设为true;自定义规则须显式声明UrlRule类,GroupUrlRule可批量添加前缀。

Yii2 路由能跑起来,核心就两件事:Web 服务器得把所有请求转给 index.php,框架里 urlManager 得配对且启用。缺一不可,顺序也不能反。
Web 服务器必须先转发请求到 index.php
美化后的 URL(比如 /site/about)不对应真实文件,Apache 或 Nginx 必须拦截并重写到入口脚本,否则直接 404。
- Apache:在
web/目录放.htaccess,内容含RewriteRule . index.php,且确保RewriteEngine on已启用 - Nginx:在 server 块中用
try_files $uri $uri/ /index.php?$args;,不能只靠location /转发 - 没配好时现象:浏览器访问
/site/about显示 404,但/index.php?r=site/about能正常打开
urlManager 的 enablePrettyUrl 和 showScriptName 必须同时设对
这两个开关是开关,不是可选项。只要有一个为 false,你写的 rules 全部失效,Url::toRoute() 也会退化成输出 ?r=xxx 链接。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
-
'enablePrettyUrl' => true:启用路径式路由解析 -
'showScriptName' => false:生成 URL 时不带index.php - 常见错误:只开了
enablePrettyUrl,忘了关showScriptName,结果链接里还带着index.php - 验证方法:在控制器里执行
var_dump(\Yii::$app->urlManager->enablePrettyUrl);,确认输出true
自定义 rules 必须显式声明 UrlRule 类型才支持正则参数
写 'post/<id:>' => 'post/view'</id:> 这种带参数的规则,本质是用了 yii\web\UrlRule,但 Yii2 默认规则不自动启用正则匹配——必须显式声明类型,否则访问时 404,生成时也不走规则。
- 正确写法:
['pattern' => 'post/<id:>', 'route' => 'post/view']</id:>,或更简洁地:new \yii\web\UrlRule(['pattern' => 'post/<id:>', 'route' => 'post/view'])</id:> - 错误写法:
'post/<id:>' => 'post/view'</id:>(数组形式下没包类、没指定class),这种只在旧版兼容模式下可能偶然生效,新版默认跳过 - 参数语法:
<id:></id:>中的\d+是正则,不写则默认匹配[^/]+(任意非斜杠字符) - 顺序很重要:泛化规则(如
'<controller>/<action>'</action></controller>)必须放在具体规则(如'api/user/<id:>'</id:>)之后,否则前者先匹配,后者永远不触发
批量加前缀别手写,用 GroupUrlRule
要给几十条 API 路由统一加 /api 前缀,逐条改 'api/v1/user' => 'v1/user' 不仅累,还容易漏。官方 GroupUrlRule 就是干这个的。
- 写法:
new \yii\web\GroupUrlRule(['prefix' => 'api', 'rules' => ['' => 'public/site/index', '<controller>/' => 'public/<controller>/']])</controller></controller> - 效果:
''实际匹配/api,'<controller>/'</controller>实际匹配/api/<controller>/</controller> - 注意:
prefix只拼在 pattern(key)左侧,不影响 route(value);空字符串''表示匹配前缀本身,不是/api/ - 别用
.htaccess或 Nginx 重写“模拟”前缀——那只是 URL 重定向,框架内部路由还是看不到/api,Url::toRoute()生成的链接也不会带它
最常被忽略的是规则是否真正参与 URL 生成:如果 rules 里某条规则的 value 是数组(比如带 defaults 或 suffix),那它只用于解析请求,Url::toRoute() 会直接跳过它——这种细节不查文档很难意识到。


















