必须同时配置web服务器重写模块(如apache启用mod_rewrite并设置allowoverride all)和yii的urlmanager组件(enableprettyurl=true、showscriptname=false及合理rules),缺一不可,否则url美化失效。

要在Yii框架项目中实现SEO友好的URL路径,必须让访问地址从 http://example.com/index.php?r=site/about 变成 http://example.com/site/about,甚至进一步简化为 http://example.com/about,这需要同时打通Web服务器重写模块与Yii内部路由配置,缺一不可。
确认Apache已启用mod_rewrite模块
打开Apache的主配置文件 httpd.conf(Windows下通常在XAMPP/WAMP安装目录的apache/conf/内),搜索 mod_rewrite.so;确保该行未被注释——即形如 LoadModule rewrite_module modules/mod_rewrite.so 是纯文本,前面没有 #。
这一步不完成,后续所有.htaccess规则都会被直接忽略,浏览器会返回404或原样输出PHP代码。
修改后重启Apache服务,否则改动无效。
设置网站目录允许重写规则
在 httpd.conf 或虚拟主机配置块(<virtualhost></virtualhost>)中,找到对应项目根目录的 <directory></directory> 块,例如:
<directory></directory>
在其内部添加或确认存在这一行:AllowOverride All。
【AllowOverride None会导致.htaccess完全失效,这是本地调试时最常踩的坑】
如果项目放在子目录(如 /myapp/),还要检查 DocumentRoot 和 Directory 路径是否指向真实物理路径,而非URL路径。
在项目根目录放置.htaccess文件
方法一:标准Yii 2官方写法(推荐)
在Web入口目录(即含 index.php 的目录,通常是 web/ 或项目根)新建纯文本文件,命名为 .htaccess(注意开头是点,Windows资源管理器可能默认隐藏扩展名,请用记事本另存为→“所有文件”类型→输入完整文件名)。
写入以下内容:
<ifmodule mod_rewrite.c><br>Options +FollowSymLinks<br>RewriteEngine On<br>RewriteCond %{REQUEST_FILENAME} !-f<br>RewriteCond %{REQUEST_FILENAME} !-d<br>RewriteRule ^(.*)$ index.php?r=$1 [L]<br></ifmodule>
方法二:兼容性更强的写法(适用于部分共享主机)
将最后一行改为:RewriteRule . index.php,这样不依赖 $1 捕获,避免因正则引擎差异导致路由参数丢失。
保存后确保文件编码为UTF-8无BOM,否则Apache可能报500错误。
配置Yii的urlManager组件
打开 config/web.php(或高级模板下的 frontend/config/main.php),在 'components' => [ ... ] 数组内添加或修改 'urlManager' 配置:
第一步:启用美化并隐藏入口脚本
'urlManager' => [<br> 'enablePrettyUrl' => true,<br> 'showScriptName' => false,<br> 'rules' => [<br> '<controller:>/<id:>' => '<controller>/view',<br> '<controller:>/<action:>' => '<controller>/<action>',<br> ],<br>],</action></controller></action:></controller:></controller></id:></controller:>
第二步:验证 baseUrl 是否正确
如果项目部署在子目录(如 http://localhost/myapp/),必须显式设置 'baseUrl' => '/myapp',否则生成的链接仍带 index.php 或跳转错位。Yii通过 $_SERVER['SCRIPT_NAME'] 推断路径,但子目录下它可能是 /myapp/web/index.php,而默认逻辑只截取到第一个 /。
第三步:清除运行时缓存
删除 runtime/cache/ 和 runtime/compiled/ 下所有文件,否则旧路由配置仍生效。
Nginx环境替代方案(无Apache时)
若使用Nginx(如LNMP、phpStudy Nginx模式),无需.htaccess;直接编辑站点配置文件(如 /usr/local/nginx/conf/vhost/example.com.conf),在 server 块内找到 location / 区域,替换为:
location / {<br> try_files $uri $uri/ /index.php?$args;<br>}
同时确认 location ~ \.php$ 块中包含:fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;。
修改后执行 nginx -t 测试语法,再 nginx -s reload 生效。











