phpenv 下需同时配置 nginx 的 server_tokens off 和 fastcgi_param server_software nginx; 并设 php.ini 中 expose_php = off,否则 php 脚本仍暴露 nginx 版本号。

phpEnv 环境下隐藏 Nginx 版本号,不能只靠 server_tokens off —— 因为 phpEnv 默认启用 FastCGI,而 PHP 会通过 SERVER_SOFTWARE 环境变量把带版本号的 nginx/$nginx_version 再次暴露出去。
确认当前是否真被隐藏了
很多用户执行 curl -I http://localhost 看到 Server: nginx 就以为搞定了,但实际漏洞还在:
- 访问一个 PHP 脚本(比如
info.php),查看$_SERVER['SERVER_SOFTWARE']值,大概率仍是nginx/1.24.0 - 某些扫描器(如 Nikto、wappalyzer)会主动请求 PHP 接口并解析该字段,
server_tokens off对它完全无效 - phpEnv 的 Nginx 配置通常位于
C:\phpenv\nginx\conf\nginx.conf(Windows)或~/.phpenv/versions/*/etc/nginx.conf(Linux/macOS),别改错文件
必须同时修改 fastcgi_param SERVER_SOFTWARE
phpEnv 使用标准 FastCGI 协议转发请求,Nginx 默认在 fastcgi.conf 或 fastcgi_params 中注入 SERVER_SOFTWARE。这个值不受 server_tokens 控制。
找到你当前 phpEnv 版本所用的 FastCGI 配置文件(常见路径:C:\phpenv\nginx\conf\fastcgi.conf),定位这行:
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
改为以下任意一种(推荐第一种):
-
fastcgi_param SERVER_SOFTWARE nginx;(最简,保留软件名,去版本) -
fastcgi_param SERVER_SOFTWARE web-server;(进一步模糊化,无识别特征) - 直接注释掉该行(部分旧版 phpEnv 可能 fallback 到空值,但不保证)
⚠️ 注意:不要用 more_set_headers 或第三方模块覆盖,phpEnv 默认不带 headers-more-nginx-module,强行加会导致 nginx -t 报错。
别忘了关掉 PHP 自己的版本暴露
phpEnv 管理多个 PHP 版本,每个版本的 php.ini 是独立的。即使 Nginx 层藏好了,PHP 还可能自己加头:
- 检查对应 PHP 版本的
php.ini(例如C:\phpenv\php\7.4.33\php.ini),确认expose_php = Off - 如果启用了
X-Powered-By头(如某些框架强制输出),需在 Nginx 的location ~ \.php$块中加:fastcgi_hide_header X-Powered-By;
- phpEnv 的 CLI 模式不会影响 HTTP 响应,不用管;但如果你用
phpenv rehash切换版本后没重启 Nginx,新php.ini不会生效
重载顺序和验证要点
phpEnv 下 Nginx 和 PHP-FPM 是分离进程,改完配置必须按顺序操作:
- 先运行
nginx -t(确保 Nginx 配置语法正确) - 再执行
phpenv nginx-reload(如果封装了命令)或手动nginx -s reload - 最后重启对应 PHP 版本的 FPM:
phpenv fpm-stop 7.4.33 && phpenv fpm-start 7.4.33 - 验证时务必用真实 PHP 请求(如
curl http://localhost/info.php | grep SERVER_SOFTWARE),不能只看curl -I的Server头
最容易被忽略的是:phpEnv 的多版本共存机制会让旧 PHP-FPM 进程残留,导致你改了 php.ini 却没生效 —— 一定要杀干净再启新进程。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











