必须同时配置Web服务器重写规则和urlManager组件,缺一不可;仅改PHP或仅改Nginx/Apache均失败,因Web服务器须先将非静态请求(如/site/about)转发至index.php,再由urlManager的enablePrettyUrl、showScriptName、enableStrictParsing三参数协同解析路由。

必须同时配置 Web 服务器重写规则和 urlManager 组件,缺一不可;只改 PHP 配置或只改 Nginx/Apache 都会失败。
Web 服务器必须先转发所有请求到 index.php
美化后的 URL(如 /site/about)不对应真实文件,服务器默认会返回 404。必须让所有非静态资源请求都由 index.php 接收并交由 Yii 路由解析。
- Apache:确保
mod_rewrite已启用,在web/目录下放.htaccess,内容含RewriteRule . index.php [L],且两个RewriteCond(!-d和!-f)不能漏 - Nginx:在
location /块中用try_files $uri $uri/ /index.php?$args;,注意空格和分号——少一个空格都可能让$args丢失,导致 GET 参数无法传递 - 常见错误现象:
/site/about返回 404,但/index.php?r=site/about正常 → 说明 Web 服务器层没转过去,不是 Yii 配置问题
urlManager 的三个关键配置项必须全开
仅设 'enablePrettyUrl' => true 不够,'showScriptName' => false 和 'enableStrictParsing' => false(或按需设为 true)共同决定是否走规则匹配、是否允许 fallback。
-
'enablePrettyUrl' => true:启用路径解析,否则所有 URL 都走r=xxx模式 -
'showScriptName' => false:隐藏index.php,若为true,Url::toRoute(['site/index'])仍会生成/index.php/site/index -
'enableStrictParsing' => false:允许未匹配规则的请求 fallback 到默认路由(如site/index);设为true后,所有请求必须命中rules中某条,否则 404 —— RESTful API 场景常用,但普通网站建议先设false排查
生成链接必须用 Url::toRoute(),别用 Url::to()
Url::to() 只做字符串拼接,完全绕过 urlManager 规则;Url::toRoute() 才真正触发路由匹配、参数注入和后缀添加。
- ✅ 正确:
Url::toRoute(['article/view', 'id' => 123])→ 输出/article/123(若规则配了'article/<id:>' => 'article/view'</id:>) - ❌ 错误:
Url::to(['article/view', 'id' => 123])→ 输出/index.php?r=article%2Fview&id=123,即使enablePrettyUrl已开启 - 路由数组格式必须是
['controller/action'],不能是['controller.action']或['ControllerClass', 'actionMethod'],源码里硬编码按/分割
自定义规则要小心顺序和语法细节
规则写进 urlManager['rules'] 数组,但匹配是**从上到下**,且正则参数必须显式声明 UrlRule 类型才生效。
- 泛化规则(如
'' => 'site/index')必须放在最后,否则会提前截断更具体的规则 - 带参数的规则如
'post/<id:>' => 'post/view'</id:>,<id:></id:>中的\d+是正则,不能写成<id></id>(默认匹配[^/]+,但不够安全) - 如果规则 value 是数组(如
['route' => 'post/view', 'defaults' => ['status' => 'draft']]),该规则**只用于解析请求,不参与 URL 生成** →createUrl()会跳过它 - RESTful 场景下,
yii\rest\UrlRule必须放在rules数组末尾,且'enableStrictParsing' => true时更要确保它不被前面的泛化规则覆盖
最易被忽略的是 Web 服务器层转发失败却去调 Yii 配置——先确认 /index.php/site/about 能访问,再开 enablePrettyUrl;否则所有排查都在错误方向上打转。


















