Apache下Yii2 URL美化失败导致404,根本原因是urlManager、.htaccess和Apache模块权限三处配置未协同:enablePrettyUrl必须为true(非字符串)、showScriptName必须为false、rules需含兜底规则;同时需开启mod_rewrite、AllowOverride All,并确保.htaccess位于web目录且内容正确。

Apache下404:三处配置必须同时对齐
Yii2的URL美化失败,90%不是规则写错,而是urlManager、.htaccess和Apache模块权限没协同生效。缺一即404或始终带index.php。
关键三处必须同时满足:
-
enablePrettyUrl必须为 true(布尔值,不是字符串'true')——否则整个美化逻辑跳过 -
showScriptName必须为 false(同理,'false'是常见错误)——否则所有URL都含/index.php/site/index -
rules至少有一条兜底规则,例如'' => 'site/index'——否则访问/直接 404
常见坑:rules 写成空数组 [],或只配了 enablePrettyUrl 和 rules 却漏掉 showScriptName => false。
Nginx下404:try_files必须兜底到index.php
Nginx默认不转发美化路径,try_files $uri $uri/ =404 会直接拒掉所有没对应物理文件的请求(比如 /post/123),根本没机会进Yii。
正确写法(放在 location / 块内):
try_files $uri $uri/ /index.php?$args;
含义:
-
$uri:查真实文件(如/css/main.css) -
$uri/:查真实目录(如/uploads/) -
/index.php?$args:都不命中,才交由 Yii 解析,且保留原始查询参数
漏掉 $args 会导致 GET 参数丢失;location ~ \.php$ 块里还必须配好 fastcgi_param SCRIPT_FILENAME 和 PATH_INFO,否则 Yii 拿不到 REQUEST_URI。
伪静态失效:web目录没设对是最隐蔽的坑
Windows 下用 XAMPP/WAMP 配不通?大概率是网站根目录没指向 web/ 子目录。
必须确认:
- Apache 的
DocumentRoot或控制面板里的「网站目录」明确设为D:\www\myapp\frontend\web(高级模板)或D:\www\myapp\web(基础模板) -
.htaccess文件真实存在且就在web/目录下(与index.php同级),注意 Windows 容易误存为.htaccess.txt - Apache
httpd.conf中:取消#LoadModule rewrite_module modules/mod_rewrite.so注释,并把对应<directory></directory>块内的AllowOverride None改为AllowOverride All
若根目录设在项目根(如 D:\www\myapp),.htaccess 不生效,敏感目录(config/、runtime/)可能被直接访问。
404页面不显示自定义内容:Web服务器提前拦截了请求
看到空白页或 Nginx 默认 404,说明请求压根没进 PHP,Yii 的 site/error 根本没机会执行。
分两层排查:
- 先确保 Web 服务器把所有非静态请求转给
index.php(Apache 用.htaccess,Nginx 用try_files) - 再确认 Yii 层:已启用
enablePrettyUrl,且errorHandler配置完整:'errorHandler' => ['errorAction' => 'site/error']
调试技巧:在 views/site/error.php 开头加 <?php var_dump($exception ?? null); die; ?>,看是否收到 yii\web\NotFoundHttpException 实例——收不到就说明请求没进框架。
真正容易被忽略的是:Nginx/Apache 的重写规则和 Yii 的 urlManager 是两条线,必须各自配对且互相配合,中间断一环,就只剩 404。


















