必须优先隐藏Server、X-Powered-By、X-AspNet-Version、X-AspNetMvc-Version、X-Application-Context、X-Debug-Token、X-Runtime等响应头,因其是自动化扫描识别技术栈的关键入口;需在proxy_pass所在location或server块中逐行配置proxy_hide_header指令,大小写不敏感但建议标准书写,且仅对代理响应生效。

用 ngx_http_proxy_module 拦截并清理敏感响应头,核心是靠 proxy_hide_header 指令——它在 Nginx 接收后端响应、转发给客户端前生效,能精准抹掉后端注入的指纹类头字段,不改代码、不重启服务。
哪些响应头必须优先隐藏
这些头是自动化扫描工具识别技术栈和版本的关键入口,应第一时间清除:
-
Server:暴露后端 Web 服务器类型与版本(如
Server: nginx/1.20.1或Server: Apache/2.4.41) -
X-Powered-By:常见于 PHP、ASP.NET、Spring Boot,直接泄露运行环境(如
X-Powered-By: PHP/8.1.12) - X-AspNet-Version、X-AspNetMvc-Version:.NET 应用典型标识
- X-Application-Context、X-Debug-Token、X-Runtime:Spring Boot、Symfony、Rails 等框架调试或上下文头
正确配置 proxy_hide_header
该指令只对 proxy_pass 代理的响应起作用,且必须写在包含 proxy_pass 的 location 或 server 块中。注意以下要点:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 每个要隐藏的头必须单独写一行,不支持正则或通配符
- 大小写不敏感,但建议按标准格式书写(如
Server而非server) - 它不影响 Nginx 自身生成的响应头(如
Date、Content-Length),也不处理错误页或缓存响应中的硬编码头
示例配置:
location /api/ {
proxy_pass http://backend-app;
proxy_hide_header Server;
proxy_hide_header X-Powered-By;
proxy_hide_header X-AspNet-Version;
proxy_hide_header X-Debug-Token;
}
配合其他指令实现完整防护
单靠 proxy_hide_header 不足以彻底隐藏技术栈。需组合使用:
- 关闭 Nginx 自身版本暴露:
server_tokens off;(放在http或server块) - 拦截错误页中的敏感信息:自定义
error_page,避免默认错误页带Server头 - 若后端返回了
Set-Cookie中含敏感字段(如Path=/admin; HttpOnly; Secure),proxy_hide_header无法处理,需改用proxy_cookie_path或应用层控制 - 静态资源若也走代理(如
/static/),同样需在对应location中配置proxy_hide_header
常见误区提醒
容易混淆或出错的操作:
-
proxy_set_header对响应头无效——它只处理请求头,不能用来删或改后端返回的响应头 -
proxy_hide_header不适用于 FastCGI 场景(如 PHP-FPM 直连),此时应使用fastcgi_hide_header - 未写
proxy_hide_header并不等于“保留原样”,而是默认透传;想删除必须显式声明空值(但它只支持删除请求头,响应头只能靠proxy_hide_header) - 某些头(如
Connection、Keep-Alive)是 HTTP/1.1 协议强制字段,Nginx 会自动处理,proxy_hide_header无法移除它们

















