nginx反向代理中过滤敏感请求头需用proxy_set_header设为空字符串(如proxy_set_header authorization "";)来覆盖而非删除,重点清除authorization、cookie及x-forwarded-for等高危头,并通过实测验证生效。

在 Nginx 反向代理中,过滤敏感请求头的核心是主动覆盖或阻断客户端携带的高危头字段,而不是依赖后端处理。关键在于用 proxy_set_header 显式设为空值,而非“删除”——因为 Nginx 本身不支持真正删除请求头,但空字符串覆盖能有效切断透传链路。
清除 Authorization 等认证类头
客户端常携带 Authorization(如 Bearer Token、Basic 凭据)或 Cookie,若后端未做隔离,可能被误用或越权调用:
- 在
location或server块中、proxy_pass之前添加:proxy_set_header Authorization "";proxy_set_header Cookie ""; - 必须用双引号包裹空字符串,写成
"",不能省略引号或留空 - 若需保留部分 Cookie(如会话 ID),应改用后端鉴权方式,Nginx 层不建议条件性透传
控制 IP 类头避免伪造与混淆
X-Forwarded-For 和 X-Real-IP 若未经清洗就透传,可能被客户端篡改,导致后端取到虚假源 IP:
- 如后端完全不依赖真实客户端 IP,可直接清空:
proxy_set_header X-Forwarded-For "";proxy_set_header X-Real-IP ""; - 如需传递真实 IP,应只设一次且来源可信:
proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - 避免在多个 location 中重复设置同名头,防止被后设指令覆盖
禁用整批请求头透传(谨慎使用)
当业务场景明确不需要任何原始请求头时,可用更彻底的方式:
- 设置
proxy_pass_request_headers off;,Nginx 将不转发客户端任何请求头 - 此时必须手动用
proxy_set_header补全后端必需的头(如Host、Content-Type) - 适用于 API 网关、静态资源代理等对上游头无依赖的场景,不推荐用于通用 Web 代理
验证是否生效
配置后务必实测,不能仅凭语法检查确认:
- 用
curl -H "Authorization: Bearer abc123" http://your-proxy/发起请求 - 在后端打印所有请求头,确认
Authorization值为空或缺失 - 临时加一行调试头:
add_header X-Debug-Authorization "$http_authorization";,通过响应头查看原始值(上线前务必移除)











