phpenv 不支持 yii2 标准 nginx 伪静态,因其精简版 nginx 未编译 rewrite 模块,try_files 和 if 语句全部失效;可改用 php 内置服务器+router.php 脚本兜底,或切换至 apache。

直接说结论:phpEnv 不支持 Yii2 的标准 Nginx 伪静态配置,因为它的 Nginx 是精简版,没编译 rewrite 模块,try_files 和 if (!-e ...) 全部失效。
phpEnv 的 Nginx 缺失 rewrite 模块导致伪静态根本不起作用
phpEnv 自带的 Nginx(尤其是 Windows 版)默认不启用 ngx_http_rewrite_module,执行 nginx -V 2>&1 | grep -o with-http_rewrite_module 会返回空。这意味着:
-
try_files $uri $uri/ /index.php?$args会直接报错或被忽略 -
if (!-e $request_filename) { rewrite ... }语法虽能加载,但运行时无效果,URL 始终带index.php - 宝塔那种「选 Laravel5 模板」的快捷方式在 phpEnv 里压根不存在
绕过 rewrite 模块:用 PHP 内置路由脚本兜底
既然 Nginx 层做不了重写,就退到 PHP 层——利用 phpEnv 内置的 PHP 开发服务器(php -S)配合 router 脚本,模拟干净 URL。适用场景:本地开发、演示、CI 构建测试。
- 在项目
web/目录下新建router.php,内容为:
<?php $uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$ext = pathinfo($uri, PATHINFO_EXTENSION);
$staticExts = ['js', 'css', 'png', 'jpg', 'gif', 'svg', 'woff2', 'ttf', 'ico', 'map'];
if ($ext && in_array($ext, $staticExts)) {
return false;
}
include __DIR__ . '/index.php';
- 确保
urlManager配置已启用:enablePrettyUrl→true,showScriptName→false - 启动命令(在
web/目录下执行):php -S localhost:8080 router.php - 此时访问
http://localhost:8080/site/login就能正确路由,无需index.php
如果硬要上 Nginx:只能换 phpEnv 或降级用 Apache
phpEnv 的 Nginx 是封闭打包的,无法通过修改配置或重新编译来启用 rewrite。实测可行路径只有两个:
- 卸载 phpEnv,改用
XAMPP或WAMP(它们的 Nginx 可手动替换,或直接切 Apache) - 保留 phpEnv,但把 Web 服务切换成它内置的 Apache —— Apache 默认启用
mod_rewrite,只要确认.htaccess在web/目录且内容正确即可 - Apache 的
.htaccess必须包含:RewriteRule ^(.*)$ index.php?r=$1 [QSA,L],且AllowOverride All已在 httpd.conf 中生效
别在 phpEnv 的 Nginx 里反复试 location / { try_files ... } —— 它连解析都跳过,日志里也不会报错,只会安静地返回 404 或原样暴露 index.php。真正的限制不在规则写法,而在模块缺失本身。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











