根本原因是url美化未真正启用,必须同时满足:enableprettyurl设为true、showscriptname设为false、web服务器(apache/nginx)已配置重写规则将请求兜底至index.php,缺一不可。

为什么开了 enablePrettyUrl 还是跳转到 /index.php?r=site/index
根本不是 Yii 配错了,而是请求压根没进美化流程——enablePrettyUrl 为 true 只是开关,但前面还卡着两道硬门槛:showScriptName 必须为 false,且 Web 服务器必须把所有非静态资源请求兜底转发给 index.php。漏掉任意一个,Yii 根本收不到原始 URL 路径,rules 数组再全也白搭。
常见表现:链接生成正常(比如 a href="/site/about"),但点开仍是 /index.php?r=site/about 或直接 404;或者首页能访问,子路径全部 404。
-
showScriptName漏设或写成true→ 所有 URL 强制带index.php,美化逻辑不触发 - Apache 没启用
mod_rewrite,或.htaccess文件不存在 / 权限被拒 /AllowOverride设为None - Nginx 的
location /块里缺try_files $uri $uri/ /index.php?$args;,或漏了$args - 高级模板中,
frontend/web或backend/web没被设为 Web 服务器的root,导致请求根本没落到入口文件
检查 urlManager 三要素是否齐备
Yii 2.0+ 的美化 URL 是“全有或全无”机制,三个配置项必须同时满足,缺一不可:
-
enablePrettyUrl→ 必须为true(仅开启开关) -
showScriptName→ 必须为false(否则所有 URL 自动补index.php) -
rules→ 至少有一条兜底规则,例如'' => 'site/index',否则根路径/直接 404
注意:rules 为空数组 [] 不等于没配——它等价于“只允许默认路由格式”,但默认格式仍依赖 Web 服务器正确传递 PATH_INFO。所以开发阶段建议先加一条最简兜底规则,排除配置空值干扰。
Web 服务器转发失败的典型错误
绝大多数“开了不生效”其实是 Web 层拦下的,Yii 根本没机会执行。验证方式很简单:直接访问带 index.php 的 URL,例如 http://localhost/index.php/site/index。如果能打开,说明 PHP、入口、控制器都 OK,问题 100% 出在重写规则上。
- Apache:
.htaccess必须存在且内容含RewriteEngine On;虚拟主机配置中AllowOverride必须为All(不能是None或FileInfo) - Nginx:
try_files必须带$args(漏掉会导致 query string 丢失,Yii 收不到r=xxx);fastcgi_split_path_info必须开启,否则无法解析/product/123中的 PATH_INFO - Windows + IIS:需安装 URL Rewrite Module,并导出对应规则;
web.config中的match url模式要覆盖所有非静态路径
高级模板下 backend/frontend 独立入口的特殊处理
高级模板的 backend/web 和 frontend/web 是两个独立入口,各自需要单独配置 Web 服务器 root 和 URL 规则。常见错误是只配了 frontend,结果访问 /backend 时 404,或误把项目根目录当作了 Web root。
- Apache:每个子应用需独立
<virtualhost></virtualhost>或<directory></directory>块,DocumentRoot指向backend/web或frontend/web - Nginx:必须为每个 location 单独写
try_files和 fastcgi 参数,不能共用一套配置;root要精确到/path/to/backend/web,而非项目根目录 - 别忘了 backend 的
urlManager也要单独开启enablePrettyUrl和showScriptName => false,它不继承 frontend 的配置
最容易被忽略的是 Nginx 中 fastcgi_param SCRIPT_FILENAME 的路径拼接方式:必须用 $realpath_root 而不是 $document_root,否则符号链接或 Windows 路径下会找不到 index.php。











