phpenv中伪静态需手动在phpenv\nginx\conf\nginx.conf的server块内配置rewrite或try_files规则,不支持.htaccess;必须显式设置fastcgi_param path_info,并用nginx -t校验后重启。

phpEnv 默认不启用伪静态,Nginx 配置必须手动加 rewrite 规则,且不能依赖 .htaccess —— 因为 phpEnv 的 Nginx 编译时没带 mod_rewrite 模块(它压根不用这个),而是靠原生 rewrite 指令和 try_files 实现。
phpEnv 的 Nginx 配置文件在哪
phpEnv 是 Windows 下的便携式 PHP 环境套件,Nginx 配置文件固定位于:phpenv\nginx\conf\nginx.conf。注意不是子目录下的 vhost 文件,phpEnv 默认只用主配置中的 server 块。
常见错误:用户去改 phpenv\nginx\conf\vhost\ 下的文件,但该目录默认不存在或未被主配置 include,改了也不生效。
实操建议:
- 用记事本或 VS Code 打开
phpenv\nginx\conf\nginx.conf - 找到
server { ... }块(通常在文件末尾) - 所有 rewrite 规则必须写在这个
server块内部,不能丢到 http 块或单独文件里 - 改完后必须执行
phpenv\nginx\nginx.exe -t校验语法,再双击运行phpenv\nginx\start.bat重启
最简可用的伪静态规则(兼容 ThinkPHP/Laravel 路由)
phpEnv 的 Nginx 默认不开启 PATH_INFO 支持,直接套用 Apache 的 index.php/xxx 路径会 404。必须用 try_files + fastcgi_param 组合把路径塞进 QUERY_STRING 或 PATH_INFO。
推荐写法(放在 server 块内):
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
关键点:
-
try_files $uri $uri/ /index.php?$query_string:优先找真实文件,不存在就甩给index.php,并透传原始查询参数 - 不要用
if (!-e $request_filename)—— phpEnv 的 Nginx 版本(通常为 1.20+)对if在 location 中的支持不稳定,易导致 500 -
fastcgi_param PATH_INFO这行必须显式添加,否则 PHP 里$_SERVER['PATH_INFO']为空
匹配具体路径的 rewrite 示例(如 /article/123 → index.php?m=article&id=123)
如果不想走统一入口,而是针对某类 URL 做精确重写,直接用 rewrite 指令更可控。例如将 /article/123 映射到 index.php?m=article&id=123:
location /article/ {
rewrite ^/article/([0-9]+)$ /index.php?m=article&id=$1 last;
}
注意细节:
- 必须以
location /article/开头,不能写成location /article(少斜杠会导致匹配 /article123 这类误伤) -
$1是正则捕获组,last表示内部重写后继续匹配新 URI,不是跳转 - 参数里的
&是 HTML 实体,在配置中必须写成&,否则 Nginx 解析报错 - 这条规则要放在
location ~ \.php$之前,否则会被 PHP 处理块提前截断
为什么改了规则却没生效?三个高频卡点
phpEnv 下伪静态失败,80% 出在以下三处,顺序排查效率最高:
-
nginx.conf里漏写了fastcgi_param SCRIPT_FILENAME—— 导致 PHP 报错“Primary script unknown”,页面空白 - Windows 防火墙或杀毒软件拦截了
nginx.exe的网络监听,netstat -ano | findstr :80查不到进程 - 浏览器缓存了 301 重定向(尤其你之前试过
permanent),清空 DNS 缓存(ipconfig /flushdns)并用隐身窗口测试
真正麻烦的是 PATH_INFO 解析逻辑:phpEnv 自带的 PHP 是线程安全版(TS),但部分扩展(如某些旧版 pdo_sqlite)在 TS 模式下对 PATH_INFO 处理异常。如果路由能进 index.php 却拿不到路径段,先检查 phpinfo() 里 PATH_INFO 是否为空,再考虑换非 TS 版 PHP。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











