Nginx过滤敏感自定义请求头的唯一可靠方式是用proxy_set_header HeaderName ""赋空值来删除;必须在location或server块中、proxy_pass前后显式配置,每行一个头,不可批量或用其他指令替代。

Nginx 默认不转发大多数客户端请求头,尤其是 Host、Connection 等协议关键头——但自定义请求头(如 X-Api-Key、X-Auth-Token、X-Internal-ID)若未显式处理,会原样透传给后端。要过滤掉敏感的自定义请求头,核心不是“拦截”,而是“不传递”:用 proxy_set_header 赋空值即可彻底删除。
用 proxy_set_header HeaderName "" 删除指定自定义头
这是唯一可靠、原生支持的方式。Nginx 将空字符串解释为“删除该头”,而非发送一个空值。
必须放在 location 或 server 块中,且在 proxy_pass 之前或之后均可(推荐紧邻 proxy_pass 上方):
-
proxy_set_header X-Api-Key ""; -
proxy_set_header X-Debug-Info ""; -
proxy_set_header X-Forwarded-User "";
⚠️ 注意:不写这行 ≠ 自动删除;只要客户端带了,Nginx 就会透传(除非是默认丢弃列表里的头)。
避免常见误操作
- 不要用
add_header或more_clear_headers(需第三方模块)来删请求头——它们只作用于响应头。 - 不要用
rewrite或map处理请求头名——这些无法修改已接收的请求头字段。 - 不要依赖
ignore_invalid_headers:它只管 header 名是否合规(如含空格),不管内容是否敏感。
批量清理多个自定义头的写法
每个头必须单独一行,不能逗号分隔或正则匹配:
location /api/ {
proxy_pass http://backend;
proxy_set_header X-Api-Key "";
proxy_set_header X-Secret-Nonce "";
proxy_set_header X-Admin-Session "";
}
验证是否生效
用 curl 模拟带敏感头的请求,检查后端收到的 headers(例如用 curl -H "X-Api-Key: abc123" http://your-nginx/api/test),再在后端打印所有收到的请求头。若对应头完全消失,说明删除成功。也可在 Nginx access_log 中加 $http_x_api_key 变量临时观察。
不复杂但容易忽略。











