Nginx反向代理无法真正删除请求头,但可通过proxy_set_header覆盖为空字符串(如proxy_set_header X-Internal-Token "";)来阻断敏感自定义头;也可用proxy_pass_request_headers off禁用所有客户端头并手动补全必需头;或结合map与if条件拦截非法值头;启用underscores_in_headers可支持含下划线的头名。

在 Nginx 反向代理中,**无法真正“删除”请求头**,但可以通过覆盖为空字符串的方式,让后端收不到敏感或非法的自定义请求头。关键不是拦截名字不合规的头(那是 ignore_invalid_headers 的事),而是对已知非法、未授权或业务禁止的自定义头(如 X-Internal-Token、X-Debug-Mode、X-Admin-Override 等)做主动阻断。
用 proxy_set_header 覆盖为空值
这是最直接有效的方式。只要在 location 或 server 块中、proxy_pass 之前设置:
proxy_set_header X-Internal-Token "";proxy_set_header X-Debug-Mode "";proxy_set_header X-Admin-Override "";
注意:必须用双引号包裹空字符串 "",不能写成 proxy_set_header X-Internal-Token ; 或留空。Nginx 会把该头设为一个空值传给后端,等效于未发送。
统一禁用所有原始请求头(慎用)
如果业务明确不需要任何客户端携带的自定义头(例如纯静态资源代理、特定 API 网关),可关闭透传:
- 加
proxy_pass_request_headers off; - 再手动补全后端必需的头,例如:
proxy_set_header Host $proxy_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Content-Type $content_type;
这种方式彻底隔绝了非法自定义头,但配置稍重,且容易遗漏必要头导致后端异常。
配合 map + if 实现条件性丢弃
若需根据头内容动态拦截(比如只丢弃值含 dev 或 test 的 X-Env 头),可用 map 提前提取并判断:
- 在
http块中定义:
~*(dev|test) 1;
default 0;
}
- 在
location中拦截:
return 400 "Invalid environment header";
}
这属于“丢弃请求”而非“丢弃头”,适合强管控场景,但需注意 if 在 location 中的限制和性能影响。
补充:允许带下划线的头名(避免误判丢失)
有些自定义头含下划线(如 X_API_Key),Nginx 默认会忽略它们。若需正常读取再过滤,先在 http 或 server 块启用:
underscores_in_headers on;
否则 $http_x_api_key 变量为空,proxy_set_header 也无法覆盖。


















