phpEnv 默认配置存在严重安全风险:Web根目录暴露全部源码,必须将root限定在public/目录,并添加location屏蔽规则禁止访问.env、config/等敏感路径,同时确保PHP解析正常且隐藏Server头。

phpEnv 是个本地开发环境套件,它默认把整个项目目录暴露在 Web 根目录下,不改配置就上线等于把源码摊开给人看。 它自带的 Nginx 配置没做任何敏感路径防护,.env、config/、vendor/、.git/ 全都能被直接下载 —— 这不是“可能泄露”,是“必然泄露”。
phpEnv 的 Nginx 默认 root 设置太危险
phpEnv 安装后,Nginx 的 root 通常指向项目根目录(比如 D:/phpEnv/www/myapp/),而 PHP 文件、配置、依赖全堆在里面。只要 URL 访问 /config/database.php 或 /.env,Nginx 就原样返回源码(因为没配 PHP 解析规则或没禁用这些路径)。
- 确认当前 root 路径:打开
D:/phpEnv/nginx/conf/vhost/*.conf,找root行,大概率是root D:/phpEnv/www/xxx; - 真正安全的做法是把 Web 入口只限定在
public/子目录,而不是整个项目根目录 - 改完后必须重启 Nginx(phpEnv 控制面板点“重启 Nginx”,别只重载)
必须加的 location 屏蔽规则(防 .env / .git / config 等)
在对应站点的 vhost 配置文件里,server 块内、location ~ \.php$ 规则之前,插入以下屏蔽段 —— 不是可选,是保命底线:
location ~ /\. {
deny all;
}
location ~* \.(env|ini|log|sql|bak|swp|dist|old|orig|backup|yml|yaml|xml|json|conf|cfg)$ {
deny all;
}
location ^~ /config/ {
deny all;
}
location ^~ /vendor/ {
deny all;
}注意:^~ 优先级高于正则,能确保 /config/ 这种路径不被后续规则绕过;~* 不区分大小写,覆盖 .ENV、.Env 等变体。
立即学习“PHP免费学习笔记(深入)”;
PHP 文件解析失效导致源码直接下载
很多 phpEnv 用户发现访问 /index.php 显示的是 PHP 源码文本,不是执行结果 —— 这说明 Nginx 没把请求转发给 PHP-FPM,本质是 FastCGI 配置缺失或错位。
- 检查
vhost文件里是否漏了location ~ \.php$块,或者它被写在了deny all规则之后(顺序错了,规则不生效) - 标准 PHP 处理块应类似:
location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } - phpEnv 自带的 PHP-FPM 默认监听
127.0.0.1:9000,别改成unix:/path/to.sock(除非你手动改过)
隐藏 Nginx 版本和 Server 头(phpEnv 也暴露)
phpEnv 打包的 Nginx 默认开启 server_tokens,响应头里明文写着 Server: nginx/1.22.1,攻击者立刻知道你用的是哪个有 CVE 的旧版本。
- 在
D:/phpEnv/nginx/conf/nginx.conf的http块顶部加:server_tokens off; more_clear_headers "Server"; more_clear_headers "X-Powered-By";
- 需要先确认已启用
headers-more-nginx-module(phpEnv 2.4+ 一般自带,若报错则删掉more_*行) - 这个设置不能只靠 .htaccess 或 vhost,必须改主配置,否则无效
最常被忽略的一点:phpEnv 的「自动更新」功能会悄悄覆盖你手动改过的 vhost 和 nginx.conf。每次升级后,务必重新检查并补上屏蔽规则 —— 否则前功尽弃。



















