nginx中可通过proxy_set_header设空值过滤请求头,map配合条件动态改写,proxy_hide_header仅作用于响应头;host头须显式设置,变量名须小写加下划线,重复设置以最后一条为准。

在 Nginx 代理转发(proxy_pass)场景下,可以通过 proxy_set_header 和 proxy_hide_header 配合变量与条件逻辑,实现对特定请求头的过滤与修改。核心思路是:**覆盖原头、清空头、或基于条件重写头字段**。
覆盖或删除请求头字段
Nginx 默认会将客户端请求头(如 Host、Connection、User-Agent 等)自动传递给上游,但部分头(如 Host、Cookie、Authorization)常需定制。使用 proxy_set_header 可显式设置值,设为空字符串可“过滤”掉该头(实际是覆盖为无值,上游通常忽略空头):
-
proxy_set_header Host $host;—— 强制使用当前 server 的 host,不传客户端原始 Host -
proxy_set_header X-Real-IP $remote_addr;—— 添加自定义头供后端识别真实 IP -
proxy_set_header Authorization "";—— 清除 Authorization 头(注意:双引号内为空,不是注释) -
proxy_set_header Cookie "";—— 移除整个 Cookie 字段(慎用,影响登录态)
按条件动态修改请求头
借助 map 指令预定义变量,再在 location 中引用,可实现条件化处理。例如:只对特定路径移除 Referer,其余保留:
map $request_uri $filtered_referer {
~^/api/ "";
default $http_referer;
}
然后在 proxy 配置中使用:
proxy_set_header Referer $filtered_referer;
类似地,可用 $http_x_forwarded_for、$scheme、$host 等变量组合构造新头值。
彻底隐藏某些请求头(不发往后端)
proxy_hide_header 仅作用于**响应头**(即从 upstream 返回给客户端时隐藏),对**请求头(发给 upstream)无效**。要确保某个头完全不发给后端,唯一可靠方式是:不设置它,或显式设为空(如上文 proxy_set_header HeaderName "";)。Nginx 不会发送值为空的请求头到 upstream。
注意事项与常见陷阱
-
Host 头必须显式设置:若未配置
proxy_set_header Host,Nginx 默认用 upstream 地址的 host(如127.0.0.1:8000),可能导致后端路由失败 -
大小写敏感:HTTP 头名在 Nginx 配置中不区分大小写(
Proxy_Set_Header和proxy_set_header等效),但变量名(如$http_user_agent)必须小写加下划线 -
避免重复设置:同一 location 内多次
proxy_set_header同一头,以最后一条为准 -
特殊头需额外指令:如想透传
Connection或Keep-Alive,需配合proxy_http_version 1.1;和proxy_set_header Connection '';(清空以启用 HTTP/1.1 持久连接)











