yii 1.x 启用美化路由需同时配置web服务器与yii:apache要启用mod_rewrite、allowoverride all并正确设置.htaccess;nginx需在server块中配置try_files和fastcgi_param;还需在yii中设urlformat='path'且showscriptname=false,并确保baseurl与实际部署路径一致。

Yii 1.x 默认不启用美化路由(pretty URL),所以 r 参数是必须的;想不用 r 就访问控制器/动作,得手动开启并正确配置 Apache/Nginx + Yii 路由规则。
Apache 下开启美化路由要改三处地方
常见错误是只改了 Yii 配置,但 Web 服务器根本没把请求转发给 index.php,结果 404 或直接暴露 PHP 文件。
- 确保
.htaccess文件在 Web 根目录(和index.php同级),内容包含RewriteRule ^(.*)$ index.php?r=$1 [L](Yii 1.1 官方写法) - Apache 必须启用
mod_rewrite,且对应目录允许重写:AllowOverride All(在<directory></directory>块里) - Yii 配置中
'urlManager' => array('urlFormat'=>'path', 'showScriptName'=>false)缺一不可;showScriptName设为false才会隐藏index.php
Nginx 下 rewrite 规则不能照搬 Apache
Nginx 没有 .htaccess,所有重写逻辑必须写在 server 块里,而且匹配逻辑不同——漏掉 try_files 或路径拼错,就会返回 404 或直接下载 PHP 源码。
- 关键配置是
try_files $uri $uri/ /index.php?r=$uri&$args;,注意$uri前面没有斜杠,?r=后面直接接路径(如/site/login) - 必须确保
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;正确,否则 PHP 不知道执行哪个文件 - 如果用子目录部署(比如
http://example.com/myapp/),try_files的/index.php要改成/myapp/index.php,否则路由参数解析错位
showScriptName=false 时链接生成依赖 baseUrl
很多人开了美化路由,但生成的链接还是带 index.php,不是路由没生效,而是 CUrlManager 构建 URL 时误判了入口脚本位置。
- 检查
$_SERVER['SCRIPT_NAME']是否为/index.php;如果实际访问的是/public/index.php却没设baseUrl,Yii 会错误地认为index.php在根目录 - 显式设置
'baseUrl' => '/myapp'(对应真实 URL 前缀),或在入口文件里调整dirname($_SERVER['SCRIPT_NAME']) -
CController::createUrl()和CHtml::link()都走这个逻辑,不修baseUrl,前端所有链接都带index.php
美化路由真正卡住人的地方,往往不在 Yii 配置本身,而在 Web 服务器是否把「看起来像目录」的请求,原样、无损地交给了 index.php 并附上原始路径。少一个 try_files,少一个 AllowOverride,或者 baseUrl 和实际部署路径对不上,都会让 r 参数死活消不掉。











