phpEnv在Windows下使用Nginx+PHP-FPM,伪静态需改vhost/*.conf文件,用try_files替代if重写,并正确配置alias、PATH_INFO及SCRIPT_FILENAME,重启服务后通过nginx -t、PHP-FPM状态和REQUEST_URI验证。

phpEnv 是 Windows 下轻量级 PHP 本地开发环境(类似 XAMPP、WAMP),默认集成 Nginx + PHP-FPM。它不带 Apache,也不支持 .htaccess,所以伪静态必须直接改 Nginx 配置文件——这点和标准 Nginx 一致,但路径、权限、重启方式有差异。
确认 phpEnv 的 Nginx 配置文件位置
phpEnv 的配置文件不在 /etc/nginx 或 C:\nginx\conf,而是在 phpEnv 安装目录下的 server\nginx\conf\nginx.conf(或 vhost\default.conf)。常见路径如:C:\phpEnv\server\nginx\conf\vhost\default.conf。
别直接改 nginx.conf 主文件,优先找 vhost\*.conf ——这是 phpEnv 管理虚拟主机的约定位置,改这里不会被更新覆盖。
修改前务必备份原文件;改完不能只点“重启服务”,要确保 phpEnv 控制面板里 Nginx 和 PHP-FPM 都被真正重启(有时只重启 Nginx,PHP-FPM 还在用旧配置)。
写 rewrite 规则时必须用 try_files 替代 if + rewrite
phpEnv 自带的 Nginx 版本(通常是 1.20+)默认禁用 if 在 location 块中的重写逻辑(Nginx 官方不推荐),直接写 if (!-e $request_filename) { rewrite ... } 会导致 nginx: [emerg] "if" directive is not allowed here 错误。
立即学习“PHP免费学习笔记(深入)”;
正确做法是用 try_files 实现等效效果:
location / {
try_files $uri $uri/ /index.php?$query_string;
}
这个规则含义是:先尝试匹配真实文件 → 再匹配目录 → 最后全部 fallback 到 index.php,并保留原始查询参数。
如果项目用的是 ThinkPHP 或 Laravel 这类框架,需要 PATH_INFO,可换成:
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
include fastcgi_params;
}
注意:fastcgi_param PATH_INFO 这行不能少,否则 $_SERVER['PATH_INFO'] 为空。
phpEnv 下访问二级目录时 rewrite 路径容易错位
比如项目放在 C:\phpEnv\www\myapp\,你希望用 http://localhost/myapp/about 访问,而不是根目录 /about。这时直接套用根目录规则会 404。
必须显式声明 location 前缀,并调整 root 或 alias:
- 用
alias(推荐):适用于子目录映射,末尾需加/ location /myapp/ { alias C:/phpEnv/www/myapp/; }- 再在里面嵌套
try_files,且index.php路径要相对这个 alias 目录 - 完整示例:
location /myapp/ {
alias C:/phpEnv/www/myapp/;
index index.php;
try_files $uri $uri/ /myapp/index.php?$query_string;
}
location ~ ^/myapp/(.*\.php)$ {
alias C:/phpEnv/www/myapp/$1;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $request_filename;
}
关键点:SCRIPT_FILENAME 必须用 $request_filename(由 alias 解析后的真实路径),不能用 $document_root$fastcgi_script_name,否则 PHP 找不到文件。
验证 rewrite 是否生效的三个必查点
伪静态配置后页面 500 或 404,不要急着改规则,先确认这三件事:
- Nginx 配置语法是否通过:
cd C:\phpEnv\server\nginx & nginx.exe -t,输出success才算过关 - PHP-FPM 是否真的在运行:
php-cgi.exe -v能返回版本号,且 phpEnv 面板里状态显示“已启动” -
index.php里是否能拿到原始路径:加一行var_dump($_SERVER['REQUEST_URI']);,访问/article/123应该输出字符串/article/123,而不是/index.php?...—— 如果是后者,说明 rewrite 没生效,还在走原始 URL
phpEnv 没有日志自动轮转,错误全堆在 C:\phpEnv\server\nginx\logs\error.log 里,打开它比猜更可靠。



















