最有效的方式是使用 proxy_set_header server "",它在代理响应阶段强制清空所有 server 头(包括后端返回和 nginx 自加的),需配合 server_tokens off 才能彻底隐藏版本信息。

直接用 proxy_set_header Server "" 是最有效的方式,它不是设置请求头,而是在代理响应阶段强制清空 Server 头(包括后端返回的和 Nginx 自己加的),比单纯靠 proxy_hide_header 更可靠。
为什么 proxy_set_header Server "" 能起作用
该指令在 Nginx 处理上游响应时介入,覆盖所有已存在的 Server 字段。只要写在 location 块中、proxy_pass 之后,就能生效。Nginx 1.1.4+ 原生支持,无需额外模块。
- 它不依赖后端是否关闭 Server 头,也不受
proxy_hide_header Server失效问题影响 - 空字符串比设为
"nginx"更干净,避免引入新标识 - 若同时用了
add_header Server "MyApp",也会被它覆盖——因为proxy_set_header在响应组装底层执行
必须配合 server_tokens off
仅清空响应头还不够,Nginx 自身也可能添加带版本号的 Server 头。需在 http、server 或 location 块中启用:
-
server_tokens off;—— 关闭 Nginx 自带的版本号(如nginx/1.22.1) - 该设置还让 4xx/5xx 错误页不显示版本文字,一并加固
- 注意:放在
http块最稳妥,确保全局生效
完整 location 配置示例
以下片段可直接用于反向代理场景,兼顾安全与兼容性:
proxy_pass https://backend.example.com;-
proxy_set_header Host $host;—— 防止后端看到内部域名 -
proxy_set_header X-Real-IP $remote_addr;—— 传递真实客户端 IP -
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;—— 合理追加而非覆盖 -
proxy_set_header X-Forwarded-Proto $scheme;—— 明确协议类型 -
proxy_set_header Server "";—— 关键:强制清空 Server 头
验证是否生效
配置完成后务必实测,不能只看语法检查:
- 执行
curl -I https://your-domain.com,确认响应头中Server:后为空或仅剩nginx - 访问一个不存在路径(如
/nonexistent),查看 404 页面源码,确认无版本字样 - 若仍看到后端 Server(如
Apache/2.4.52),说明后端未禁用自身头,需同步处理其配置











