Yii2 URL美化需Apache重写规则与urlManager配置协同生效:Apache必须通过.htaccess将非静态请求转发至index.php,urlManager再依rules解析;缺一即404。

Yii2 的 URL 美化(pretty URL)要真正生效,urlManager 配置只是后半段;Apache 的重写规则是前半段,缺一不可。没配好 Apache,所有美化路由都会 404。
Apache 必须把请求兜底给 index.php
Yii2 路由解析发生在 PHP 层,前提是请求得先进入 index.php。Apache 默认只认真实文件路径,像 /site/about 这种路径根本不存在,不转发就会直接 404。
- 确保
mod_rewrite已启用:检查httpd.conf或运行a2enmod rewrite(Debian/Ubuntu) -
.htaccess必须放在 Web 根目录(通常是web/或public/),内容至少包含:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
注意:!-f 和 !-d 是关键——它放行真实存在的静态文件(如 css/app.css)和目录(如 uploads/),只把“找不到”的请求交给 index.php。
urlManager 配置必须与 Apache 规则对齐
Apache 把请求交进来后,urlManager 才开始干活。它不会自动知道你用了什么前缀或后缀,必须显式告诉它。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
-
enablePrettyUrl必须设为true -
showScriptName必须设为false(否则生成的 URL 还带index.php) -
suffix如果你加了.html后缀(如/site/about.html),就要同步配置'suffix' => '.html',否则匹配失败 - 规则顺序很重要:更具体的规则(如
'post/<id:>' => 'post/view'</id:>)要写在泛用规则(如'<controller>/<action>')前面,否则被提前捕获
子目录部署时 RewriteBase 容易漏掉
如果你不是部署在域名根路径,而是类似 https://example.com/myapp/,那么 Apache 的重写会出错——^.*$ 匹配的是完整 URI 路径,但 index.php 实际在子目录里。
- 必须在
.htaccess中加RewriteBase /myapp/(末尾斜杠不能少) - 同时确认
urlManager的baseUrl也指向正确路径,否则Url::to()生成的链接会漏前缀 - 如果用
GroupUrlRule统一加api/前缀,那这个前缀是作用于路由匹配层,和RewriteBase无关;但最终浏览器访问的 URL 路径 =RewriteBase+GroupUrlRule.prefix+ 具体规则
调试时优先看 Apache 日志和 $_SERVER['REQUEST_URI']
美化 URL 失效,90% 是 Apache 没转进来,而不是 Yii2 配错了。别急着改 rules 数组。
- 打开 Apache 的
error_log,看有没有File does not exist提示——如果有,说明重写没生效,请求压根没到 PHP - 在
index.php开头临时加var_dump($_SERVER['REQUEST_URI']); die();,看实际进来的路径是不是你预期的(比如是/site/about还是/index.php?r=site/about) - 用
curl -I http://yoursite.com/site/about看返回状态码:如果是 404,问题在 Apache;如果是 200 但内容不对,才查 Yii2 路由逻辑
最常被忽略的是 AllowOverride All 没开,导致 .htaccess 完全不执行——这时无论规则写得多对,都等于没写。


















