真正能彻底清除后端敏感头的是headers-more-nginx-module模块,因proxy_hide_header仅屏蔽不转发,而more_clear_headers可真正删除响应头(含缓存、错误页),并需配合server_tokens off才能完全收敛server头。

要用 Nginx 清除后端暴露的敏感软件信息(比如 Server、X-Powered-By 等),单靠原生 proxy_hide_header 不够彻底——它只能屏蔽后端返回的响应头,但不处理 Nginx 自身输出的头,也不支持清空或重写。真正能实现“清除”效果的是 headers-more-nginx-module 模块。
为什么需要 headers-more 模块
原生 Nginx 的 proxy_hide_header 只是“不转发”,不会从响应中真正移除头字段;而 more_clear_headers 是真正的删除操作,哪怕头被多次设置、或出现在错误页/缓存响应中,也能生效。它还能配合 more_set_headers 主动设为安全值,比隐藏更可控。
安装与启用模块
该模块非 Nginx 默认内置,需确认环境是否已集成:
- 使用 OpenResty:默认已编译包含,可直接用
- 自编译 Nginx:需添加
--add-module=path/to/headers-more-nginx-module - 主流发行版(如 Ubuntu 的 nginx-extras)可能已打包,运行
nginx -V 2>&1 | grep -o with-http_headers_more_module验证
清除敏感响应头的标准写法
在 location 或 server 块中使用:
more_clear_headers 'Server' 'X-Powered-By' 'X-AspNet-Version' 'X-Application-Context' 'X-Debug-Token';
注意:
- 每个头名用单引号包裹,空格分隔,大小写不敏感但建议按标准写法(如
Server) - 该指令对所有响应生效,包括正常响应、缓存命中响应、甚至部分错误页(比
proxy_hide_header覆盖面广) - 若需保留某个头但值为空,可用
more_set_headers "Server: ";(末尾带空格)
搭配 server_tokens 彻底收敛 Server 头
more_clear_headers 'Server' 只清除后端返回的 Server,Nginx 自己生成的仍可能残留。必须同步配置:
server_tokens off;
放在 http 或 server 块中。该设置让 Nginx 不输出版本号(如 nginx/1.24.0),只留 nginx 或完全不发该头——再配合 more_clear_headers,才能真正实现“无 Server 头”。
验证是否清除干净
别只信配置,用真实请求检查:
- 正常接口:
curl -I https://your.com/api/test,确认目标头完全消失 - 触发 502 错误:
curl -I https://your.com/invalid,检查错误页响应头(很多框架错误页硬编码Server) - 查看缓存响应:
curl -I https://your.com/static/app.js(若启用了 proxy_cache),确保缓存内容也不含敏感头











