proxy_hide_header需置于proxy_pass之后且仅在当前location生效,用于屏蔽x-powered-by、server(上游)、x-aspnet-version等后端敏感响应头;须配合server_tokens off隐藏nginx自身server版本号,并通过add_header统一添加安全头。

直接在 location 块中写 proxy_hide_header 并放在 proxy_pass 之后,是最有效且低风险的方式。它不改响应体、不干扰正常流程,专用于剥离后端暴露的敏感头字段。
优先隐藏哪些头字段
这些头常见于 Spring Boot、Express、ASP.NET、PHP 等后端框架,默认开启且极易被扫描工具识别:
-
X-Powered-By:暴露语言和框架版本,如
Express、PHP/8.2.12 -
Server(上游):后端 Apache/Tomcat/Nginx 的原始标识,如
Server: Apache/2.4.52 - X-AspNet-Version 和 X-AspNetMvc-Version:.NET 应用专属,泄露框架细节
-
X-Application-Context:Spring Boot 默认返回,含 profile 名称(如
application:prod) - X-Runtime:Rails 或 Java 中间件常用,值为毫秒级耗时,可辅助判断技术栈和性能特征
- X-Debug-Token、X-Debug-Token-Link:Symfony/Drupal 调试头,生产环境必须清除
正确配置位置与写法
该指令仅对当前 location 生效,且必须位于 proxy_pass 之后——顺序错误会导致完全不生效:
✅ 正确示例:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
location /api/ {
proxy_pass http://10.0.1.5:8080/;
proxy_hide_header X-Powered-By;
proxy_hide_header Server;
proxy_hide_header X-Application-Context;
proxy_hide_header X-Runtime;
}
❌ 常见错误:
- 写在
proxy_pass前面 - 试图用逗号分隔多个头:
proxy_hide_header X-Powered-By, Server;(不支持) - 只在
http块里配置,期望子location自动继承(不会)
配合其他关键安全措施
单靠 proxy_hide_header 不够,需组合使用才能形成完整防护:
- 关闭 Nginx 自身
Server版本号:server_tokens off;(放在http或server块) - 统一添加安全响应头:
add_header X-Content-Type-Options nosniff;、add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; - 避免后端重复输出冲突头:如
X-Frame-Options或X-XSS-Protection,由 Nginx 统一管控更可靠 - 若需透传某些内部调试头(如
X-Trace-ID),就不要加proxy_hide_header X-Trace-ID
验证是否真正生效
别依赖 reload 后“应该没问题”,必须实测响应头:
- 确认请求路径命中目标
location(例如你配在/api/,就别用/health测) - 检查成功响应(200)和典型错误响应(500、404)——很多调试头只在错误页出现
- 推荐命令:
curl -I https://your-domain.com/api/v1/users,观察输出中是否已无目标头 - 注意:
Content-Security-Policy、Set-Cookie等关键头不能被误删,它们不受proxy_hide_header影响,除非你显式写了










