Yii URL重写需框架层(urlManager配置)与Web服务器层(Apache/Nginx规则)协同生效;仅配其一必致404或index.php残留。

URL重写在 Yii 中必须分两步走:框架层配置 urlManager + Web 服务器层启用重写规则。只配一边,404 或 index.php 强制出现是必然结果。
怎么配 urlManager 才生效
关键不是开开关,而是确保 enablePrettyUrl 启用、showScriptName 关闭、rules 写对格式 —— 尤其注意大小写和斜杠位置。
-
urlManager必须定义在config/web.php的components数组里,不能放在params或顶层 -
enablePrettyUrl设为true,但若服务器不支持重写,它会自动退化回index.php模式,不报错也不提示 -
showScriptName必须为false,否则即使规则匹配,生成的 URL 仍带index.php - 单条规则推荐用键值对写法:
'vmmembers/<name>' => 'window/view'</name>,比嵌套数组更不易漏字段 - 正则捕获需显式声明,比如
<name:></name:>,不能只写<name></name>,否则匹配任意字符(包括斜杠),导致路由冲突
Apache 下 .htaccess 常见失效原因
Yii 自带的 .htaccess 文件只在 web/ 目录下起作用,且依赖 mod_rewrite 开启和 AllowOverride All 配置。
- 确认 Apache 已加载
rewrite_module:运行a2enmod rewrite并重启服务 -
.htaccess必须放在与index.php同级的web/目录内,不是项目根目录 - 虚拟主机配置中必须允许覆盖:
AllowOverride All要出现在对应<Directory>块里,仅靠.htaccess文件存在没用 - 如果用 XAMPP/MAMP,检查控制面板里是否勾选了 “Enable Apache mod_rewrite”
- 规则末尾别加多余空格或 BOM 字符,会导致
Internal Server Error
Nginx 下必须手动补全重写逻辑
Nginx 不读 .htaccess,所有重写必须硬编码进 server 配置块,且 try_files 顺序错了就直接 404。
- 入口路径必须指向
web/目录:root /var/www/myapp/web;,不是项目根目录 -
location /块里必须用try_files $uri $uri/ /index.php?$args;,漏掉$args会导致 GET 参数丢失 - PHP 处理块要明确指定
SCRIPT_FILENAME:fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;,错写成$request_filename会找不到脚本 - 不要把
location ~ \.php$块写在location /外面,Nginx 不会继承内部变量
调试时先验证哪一层坏了
遇到重写失败,按顺序排除,避免反复改配置却卡在错误环节。
- 访问
https://yoursite.com/index.php/site/about能打开?→ 框架本身正常;打不开 → 先查 PHP 环境、vendor是否完整、runtime是否可写 - 访问
https://yoursite.com/site/about返回404,但https://yoursite.com/index.php/site/about可用 → Web 服务器层未生效 - 访问
/site/about跳转到/index.php/site/about→showScriptName没关,或urlManager配置未加载(常见于高级模板中frontend/config/main-local.php覆盖了主配置) - 规则写了
'post/<id:>' => 'post/view'</id:>,但访问/post/abc却进了post/view→ 正则太宽泛,\d+应该写成[0-9]+并加锚点,或换用更严格的模式如<id:></id:>
最易被忽略的是:本地开发用 Apache + .htaccess,上线换 Nginx 后忘了重写配置迁移,或者 Docker 容器里没装 mod_rewrite 也没配 try_files —— 这类问题不会报错,只会静默降级。


















