phpEnv伪静态常失效因默认配置无rewrite规则且不读.htaccess;须手动修改vhost/site.conf中location /块,添加try_files $uri $uri/ /index.php?$query_string,并重启Nginx。

phpEnv 默认不启用 Nginx 伪静态,必须手动修改其生成的站点配置文件,且不能依赖 .htaccess —— 因为 phpEnv 底层用的是 Nginx,不是 Apache。
为什么 phpEnv 的伪静态经常失效
phpEnv 是 Windows 下轻量级 PHP 集成环境(基于 Nginx + PHP-FPM),它会为每个站点自动生成 nginx.conf 片段,但默认配置里没有 rewrite 规则,也不开启 try_files 或 if (!-e $request_filename) 判断。直接丢 .htaccess 进去完全没用,Nginx 根本不读这个文件。
- 常见错误现象:
http://localhost/article/123报 404,而http://localhost/article.php?id=123能正常访问 - 根本原因:请求路径未被重写到 PHP 入口,Nginx 尝试直接找
/article/123这个目录或文件,当然找不到 - phpEnv 的 Nginx 配置通常禁用
if在location /外使用,所以规则必须放在正确的location块内
修改 phpEnv 自动生成的 Nginx 配置文件
phpEnv 的站点配置文件位于:phpEnv\nginx\vhost\{your-site-name}.conf。不要改全局 nginx.conf,否则下次 phpEnv 升级或重建站点会被覆盖。
- 打开该文件,找到类似这样的
location /块: - 在
location / { ... }内部,紧贴在index指令之后、location ~ \.php$之前,插入以下标准伪静态逻辑:
location / {
index index.php index.html;
try_files $uri $uri/ /index.php?$query_string;
}
- 确保已有且未被注释的
location ~ \.php$块存在,并正确指向fastcgi_pass(phpEnv 通常设为127.0.0.1:9000) - 保存后,在 phpEnv 主界面点击「重启 Nginx」—— 不是「重启服务」,也不是只重启 PHP
ThinkPHP/Laravel 等框架的适配要点
很多框架(如 ThinkPHP 5+、Laravel)默认依赖 PATH_INFO 或 QUERY_STRING 解析路由,而 phpEnv 的默认 fastcgi 配置可能未透传完整路径。需额外检查并补全两处:
立即学习“PHP免费学习笔记(深入)”;
- 在同一个
{your-site-name}.conf文件中,找到location ~ \.php$块,在fastcgi_param SCRIPT_FILENAME后追加:
fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param SCRIPT_NAME $fastcgi_script_name;
- 确认 PHP 配置中
cgi.fix_pathinfo=1(phpEnv 的php.ini一般已设,但建议搜索验证) - ThinkPHP 若用
public/index.php入口,root 必须指向public/目录,否则try_files会跳过入口直接 404
调试时最常忽略的三个细节
规则写对了却还是 404?大概率卡在这三处:
-
try_files中的/index.php?$query_string—— 如果你的入口是router.php或app.php,这里必须同步改掉,不能硬写index.php - Nginx 日志默认关闭;打开
phpEnv\nginx\logs\error.log,看到open() "/path/to/article/123" failed (2: No such file or directory)才算确认重写未触发 - Windows 下路径分隔符是反斜杠,但 Nginx 配置里所有路径一律用正斜杠(
/),写成\会导致语法错误且 phpEnv 不报提示



















