启用URL美化需同时配置urlManager的enablePrettyUrl=true、showScriptName=false及服务器重写规则,缺一不可;Apache需启用mod_rewrite并正确设置AllowOverride和.htaccess,Nginx需在location /中配置try_files,路由规则参数名须与action方法一致。

Yii 2.0.43 中启用 URL 美化必须改 urlManager 配置
不配置 urlManager 的 enablePrettyUrl 和 showScriptName,index.php 就永远在 URL 里。Apache 或 Nginx 的重写规则只是“配合”,不是替代。
常见错误是只配了服务器重写,却漏掉 PHP 层配置,结果 404 或跳回带 index.php 的地址。
-
enablePrettyUrl必须设为true,否则路由解析走默认 query-string 模式 -
showScriptName必须设为false,否则生成的 URL 仍带index.php - 推荐同时设置
suffix(如'.html'),避免和静态文件路径冲突
典型配置位置:config/web.php 中的 components 下:
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'suffix' => '.html',
],
Apache 下必须启用 mod_rewrite 并配好 .htaccess
没开 mod_rewrite 或 AllowOverride 权限不足,.htaccess 就被忽略——这是本地开发环境最常踩的坑。
立即学习“PHP免费学习笔记(深入)”;
确认方法:访问任意不存在路径,如果返回 Apache 默认 404 而不是 Yii 的 404 页面,说明重写根本没生效。
- 确保 Apache 启用了
mod_rewrite(a2enmod rewrite) -
DocumentRoot对应目录下AllowOverride至少为All或FileInfo -
.htaccess必须放在web/目录下(不是项目根目录)
标准 .htaccess 内容(Yii 2.0 官方推荐):
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php
Nginx 下不能依赖 try_files 默认行为
Nginx 不像 Apache 自动读 .htaccess,所有重写逻辑必须显式写进 server 块。漏掉 try_files 或写错顺序,会导致静态资源 404 或 PHP 脚本直接下载。
关键点:必须把 try_files $uri $uri/ /index.php?$args 放在 location ~ \.php$ 外面的 location / 块里,否则请求根本进不到 PHP 处理环节。
- 不要用
rewrite指令模拟 Apache 规则,容易循环重定向 - 确保
fastcgi_param SCRIPT_FILENAME指向正确路径(通常是$document_root$fastcgi_script_name) - 如果用 Docker 或非标准 root,
$document_root可能不是你预期的路径,建议用绝对路径调试
路由规则写错会导致 createUrl() 生成异常或匹配失败
自定义规则里正则没转义、参数名和 action 参数不一致、或规则顺序颠倒,都会让 Url::to() 返回空字符串或错误 URL,后端也收不到请求。
比如写 'post/<id:>' => 'post/view'</id:>,但控制器里 actionView() 参数叫 $pid,就会匹配失败。
- 规则中正则部分用
<id:\d+>,对应 action 方法参数名必须是$id - 多条规则有包含关系时,更具体的规则要写在前面(如
'admin/<action:>'</action:>在'<controller:>/<action:>'</action:></controller:>前) - 调试时可临时加
'enableStrictParsing' => true,强制不匹配就报 404,比静默 fallback 更易发现问题
示例安全写法:
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'enableStrictParsing' => YII_DEBUG,
'rules' => [
'post/<id:\d+>' => 'post/view',
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
],
],
URL 美化真正卡住的地方,往往不在某一行配置,而在于 Apache/Nginx + PHP 配置 + 路由规则三者之间那点微妙的对齐。少一个 false,少一行 try_files,或者参数名差一个字母,整个链路就断了。











