nginx 代理需清空或重写敏感请求头以防止后端信息泄露,核心是用 proxy_set_header 显式覆盖 authorization、cookie、x-forwarded-for 等头,禁用伪造 ip 和调试头,并通过 map 实现动态过滤。

清除 Nginx 代理请求头中的敏感后端服务器特征信息,核心是**不把客户端原始请求中可能暴露后端结构或凭证的头转发过去**。这主要靠 proxy_set_header 显式覆盖或清空,而不是“隐藏”——它本质是重写或删除。
重点清理 Authorization、Cookie 和伪造 IP 类请求头
这些头若原样透传,极易导致越权或会话泄露:
-
Authorization:必须用
proxy_set_header Authorization "";清空(双引号不能省);放在proxy_pass前,否则无效 -
Cookie:如后端无需用户会话(例如静态资源网关),可加
proxy_set_header Cookie "";;若需保留部分字段,需配合map模块做条件过滤 -
X-Forwarded-For:避免链式堆叠或伪造,推荐设为可信来源:
proxy_set_header X-Forwarded-For $remote_addr;;若后端完全不依赖真实 IP,直接清空:proxy_set_header X-Forwarded-For ""; -
X-Real-IP:若已用
$remote_addr保证可信,可不设;若设,应明确指向$remote_addr,而非信任客户端传入的值
防止内部标识和调试头泄露
有些头是业务系统自定义添加的,比如 X-Internal-Cluster、X-Debug-Token、X-Trace-ID 等,虽非标准,但可能暴露架构细节:
- 统一清空:对每个敏感头单独写一行,如
proxy_set_header X-Internal-Cluster ""; - 注意大小写不敏感,但建议按规范首字母大写书写,便于维护
- 若头名含下划线(如
X_My_App_ID),需确认 Nginx 已启用underscores_in_headers on;,否则会被忽略
重写 Host 和 Connection 头避免歧义
默认转发的 Host 可能是客户端随意构造的,Connection 可能干扰连接复用:
- 强制使用目标后端期望的域名:
proxy_set_header Host backend.example.com;(比$host更可控) - 禁用自动添加的
Connection: keep-alive:proxy_set_header Connection '';(空字符串可阻止发送该头) - 如需保留原始 Host 但去除端口等干扰项,可用
$http_host或正则 +map提取干净值
用 map 实现动态头控制(进阶)
静态清空太粗放?比如只想允许合法 Referer、只传 IPv4 格式的 X-Forwarded-For:
- 先定义映射:
map $http_x_forwarded_for $safe_xff { default ""; ~^(\d+\.\d+\.\d+\.\d+)$ $1; } - 再应用:
proxy_set_header X-Forwarded-For $safe_xff; - 类似地,可对
Referer、Origin做白名单过滤,避免误传恶意来源











