开启伪静态需配置三项:enableprettyurl设为true、showscriptname设为false、rules设置兜底规则(如''=>'site/index'),缺一不可导致404。

urlManager 开启伪静态要改哪几个配置项
Yii 2.0.50 默认走 index.php?r=site/index 这种带查询参数的 URL,要变 /site/index 这种,核心就三处必须改:开启 enablePrettyUrl、关闭 showScriptName、配好 rules。少一个都 404。
常见错误现象:页面全 404,或者部分路由正常但带 index.php 不消失——大概率是 showScriptName 没设为 false,或 Web 服务器没配 rewrite 规则(这点后面会说)。
-
enablePrettyUrl必须设为true,否则整个模块不生效 -
showScriptName必须设为false,否则 URL 里永远挂着index.php -
rules至少得有一条兜底规则,比如'' => 'site/index',不然根路径直接报错
Apache 下 rewrite 规则漏了会导致 404
Yii 的 urlManager 只负责解析 URL,不负责重写。如果 Apache 没配好 .htaccess 或主配置里的 RewriteRule,请求根本到不了 PHP,直接 404。
检查点很具体:确认 mod_rewrite 已启用;确认项目根目录下有 .htaccess 文件且内容包含标准 Yii 规则(尤其 RewriteCond %{REQUEST_FILENAME} !-f 和 RewriteCond %{REQUEST_FILENAME} !-d 这两行不能少);确认 Apache 配置中 AllowOverride All 已开在对应 <directory></directory> 块里。
- 典型错误:本地开发用 XAMPP,
.htaccess存在但 Apache 没开AllowOverride,结果所有伪静态路由 404 - 另一个坑:部署到某些共享主机,
mod_rewrite被禁用,这时只能退回到enablePrettyUrl => false,别硬扛
rules 里怎么写通配路由才不冲突
伪静态规则顺序很重要。rules 是从上到下匹配,一旦命中就停止。所以更具体的路由必须写在前面,泛用规则(比如带 <action:></action:> 的)得放后面,否则会吞掉其他路由。
比如你要定义 /api/v1/users 和 /user/<id:></id:>,前者必须在前,否则 /user/123 会被 /user/<id:></id:> 匹配,而 /api/v1/users 根本没机会被识别。
- 避免用
'<controller:>/<action:>' => '<controller>/<action>'</action></controller></action:></controller:>放最前——它会吃掉所有两段式 URL,包括你后续想单独配的post/view、admin/login - 需要支持可选参数?用
'<controller:>/<action:>/<id:>' => '<controller>/<action>'</action></controller></id:></action:></controller:>这类显式规则,别依赖模糊匹配 - 调试技巧:临时加一条
'debug/route' => 'site/debug-route',手动访问看是否命中,比猜快得多
nginx 配置和 Apache 不同,不能直接抄
很多人把 Apache 的 .htaccess 规则照搬进 nginx 的 server 块,结果 404 或 500。nginx 没有 .htaccess 概念,所有 rewrite 逻辑必须写在 server 配置里,且语法完全不同。
关键差异:nginx 用 try_files 判断文件/目录是否存在,再 fallback 到 index.php;Apache 用 RewriteCond + RewriteRule。漏掉 try_files $uri $uri/ /index.php?$args; 这句,伪静态就断了。
- 常见错误:只写了
location ~ \.php$ { ... },但没配location /块里的try_files,导致非 PHP 路径(如/about)直接 404 - 另一个坑:PHP-FPM 的
fastcgi_param SCRIPT_FILENAME没设对,$document_root$fastcgi_script_name缺一不可,否则index.php找不到入口文件
index.php 手里。调不通时,先 curl -I 看响应头,再查 Web 服务器 error log,比反复改 rules 有效得多。











