nginx过滤敏感请求头最稳妥方式是禁用自动透传(proxy_pass_request_headers off)后仅显式设置白名单头;若需保留大部分头则用map指令条件清空特定头(如authorization),并启用underscores_in_headers确保下划线头兼容。

直接用 proxy_set_header 无法“过滤”请求头,它只负责设置或覆盖上游请求头。真正实现敏感头过滤,靠的是 proxy_pass_request_headers off 配合显式声明需要透传的头,或者用 underscores_in_headers on + 条件重写等辅助手段。核心思路是:默认不透传,只放行白名单头。
禁用自动透传,只显式设置必要头
Nginx 默认会把客户端所有请求头原样转发给上游(除 Host、Connection 等少数内置处理头外)。要杜绝敏感头(如 Authorization、X-Forwarded-For、Cookie、Referer 等)意外泄露,最稳妥做法是关闭自动透传:
- 在
location或server块中添加:proxy_pass_request_headers off; - 然后仅用
proxy_set_header显式设置你真正需要的头,例如:proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;(注意:若不需要真实 IP,这行也应删掉) - 未显式设置的请求头(包括
Authorization、Cookie、User-Agent等)将完全不会发往后端
按需清除特定敏感头(保留其他头)
如果必须保留大部分原始请求头,仅移除个别敏感字段(比如去掉 Authorization 但保留 Accept、Content-Type),可借助 map 指令做条件屏蔽:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 在
http块中定义空值映射:map $http_authorization $empty { default ""; "" ""; } - 在
location中使用:proxy_set_header Authorization $empty;
这会让Authorization头被设为空字符串——多数后端会忽略空值头,等效于删除 - 同理可对
$http_cookie、$http_x_api_key等自定义敏感头做类似处理
注意大小写与下划线兼容性
Nginx 默认忽略带下划线的请求头(如 X-API-Key 被转为 x-api-key,但 X_Api_Key 可能被丢弃),且不区分大小写匹配变量名($http_authorization 和 $http_AUTHORIZATION 等价):
- 确保
underscores_in_headers on;已启用(尤其当上游依赖下划线命名头时) - 敏感头变量名一律用小写加下划线格式:
$http_x_forwarded_for、$http_cookie - 避免用
proxy_hide_header—— 它只作用于响应头,对请求头无效
验证是否生效的简单方法
配置完成后,可用 curl 模拟带敏感头的请求,再在 upstream 服务日志中检查实际收到的头:
- 测试命令:
curl -H "Authorization: Bearer abc123" -H "X-Secret: test" http://your-nginx/ - 观察后端 access log 或打印全部请求头的调试接口,确认
Authorization和X-Secret是否缺失 - 也可用
error_log /path/to/log notice;+log_format debug '$http_authorization $http_cookie';在 Nginx 日志中临时记录原始值用于排查










