yii2伪静态失效主因是三处未对齐:网站根目录须指向web子目录、apache需启用mod_rewrite并设allowoverride all、.htaccess与urlmanager配置必须协同生效,缺一即导致404或index.php残留。

Windows 安装 Yii2 后 Apache 伪静态配不通,90% 的问题不是规则写错了,而是入口路径、模块权限和配置层级没对齐。核心就三点:web 目录必须是网站根目录、mod_rewrite 必须启用且 AllowOverride 全开、.htaccess 和 urlManager 必须协同生效。
第一步:确认 Apache 模块已启用
伪静态依赖 mod_rewrite,但 Windows 下(XAMPP/WAMP/phpEnv)默认常被注释掉:
- 打开 Apache 配置文件 httpd.conf(XAMPP 路径通常是
xampp\apache\conf\httpd.conf) - 搜索
mod_rewrite.so,取消这行前面的#:LoadModule rewrite_module modules/mod_rewrite.so - 再搜索
AllowOverride None,把它改成AllowOverride All(注意:要改的是<directory></directory>块内的那一处,不是全局所有地方) - 保存后重启 Apache 服务
第二步:网站根目录必须指向 web 子目录
Yii2 高级模板中,frontend/web 或 backend/web 才是合法的 Web 入口。若把站点根目录设成项目根文件夹(如 D:\www\myapp),会导致:
- 敏感目录(config/、runtime/、vendor/)被直接访问,可能泄露数据库配置
- .htaccess 文件不生效(因不在 DocumentRoot 下)
- URL 美化失败,始终带
index.php或报 500 错误
在 phpEnv/XAMPP 控制面板中,将「网站目录」明确设为:D:\www\myapp\frontend\web(前台)或 D:\www\myapp\backend\web(后台)
第三步:.htaccess + urlManager 双向验证
两个地方必须同时正确,缺一不可:
-
.htaccess 文件:放在
web/目录下(与index.php同级),内容如下:
RewriteEngine On<br>RewriteCond %{REQUEST_FILENAME} !-f<br>RewriteCond %{REQUEST_FILENAME} !-d<br>RewriteRule . index.php
-
config/web.php 中的
urlManager配置(frontend/config/web.php 或 backend/config/web.php):
'urlManager' => [<br> 'enablePrettyUrl' => true,<br> 'showScriptName' => false,<br> 'rules' => [],<br>],
注意:'rules' 可为空数组,不需要硬写路由映射;只要 enablePrettyUrl 开启且 showScriptName 关闭,就能隐藏 index.php。
第四步:检查常见隐形陷阱
-
PHP 版本与扩展:确保 PHP ≥ 7.4,且已启用
openssl、mbstring、curl、pdo;用php -m检查 -
运行时目录权限:
runtime/和web/assets/必须可读写(右键 → 属性 → 安全 → 编辑 → 添加 IIS_IUSRS 或 Users 并勾选“写入”) -
CSRF 验证干扰:如果开启伪静态后 AJAX 提交报 400,检查是否漏了 meta 标签:
<meta name="csrf-token" content="<?= Yii::$app->request->csrfToken ?>"> - 浏览器缓存干扰:测试时清空浏览器缓存或用无痕窗口,避免旧重定向规则残留











