proxy_set_header通过赋空字符串""可原生删除请求头,如x-forwarded-for、proxy-connection、user-agent、accept-encoding;而proxy_hide_header仅用于删除上游响应头,二者作用对象不同。

直接在 proxy_set_header 中将目标请求头设为空字符串,Nginx 会自动将其从转发给后端的请求中移除——这是最轻量、无需额外模块的原生方式。
哪些请求头适合用空变量抹除
常见需清理的不安全或冗余请求头包括:
- X-Forwarded-For:当反代链路已可信(如仅经内部负载均衡),重复添加可能被伪造
- Proxy-Connection:HTTP/1.0 遗留字段,现代后端通常忽略,且可能干扰连接复用
- User-Agent:若后端无需识别客户端类型,统一抹除可减少指纹暴露
- Accept-Encoding:当后端不支持解压(如静态文件服务),保留该头可能导致 406 或压缩异常
配置写法与生效逻辑
在 location 或 server 块中使用 proxy_set_header 赋值为空字符串即可:
location /api/ {
proxy_pass http://backend;
proxy_set_header X-Forwarded-For "";
proxy_set_header Proxy-Connection "";
proxy_set_header User-Agent "";
proxy_set_header Accept-Encoding "";
}
注意:赋值必须是双引号包围的空字符串 "",不能省略引号或写成 off/none。Nginx 解析时会将空字符串视作“删除该头”,而非传递一个空值。
与 proxy_hide_header 的关键区别
proxy_hide_header 只作用于响应头(即后端返回给 Nginx,再由 Nginx 返回给客户端的头);而 proxy_set_header <name> ""</name> 作用于请求头(即 Nginx 发送给后端的头)。两者不可混用,目标不同。
- 想删客户端发来的某请求头 → 用
proxy_set_header <name> ""</name> - 想删后端返回的某响应头 → 用
proxy_hide_header <name></name>
验证是否生效
在后端服务(如 Flask/FastAPI/Nginx 本地测试端口)日志中检查接收到的原始请求头,或用 tcpdump 抓包确认:
# 在后端机器执行,监听代理端口(如 8000) tcpdump -i lo -A port 8000 | grep -E "^(X-Forwarded-For:|User-Agent:)"
若对应行未出现,说明已成功抹除。也可用 curl 模拟请求并观察后端 access log 中的 $http_x_forwarded_for 等变量是否为空。











