proxy_set_header 用于修改或删除转发给后端的请求头以隐藏敏感信息,如通过覆盖 x-real-ip、清空 x-forwarded-for、重写 host 或清除 authorization 等头,并可结合 map 实现动态控制。

在 Nginx 中,proxy_set_header 本身不直接“隐藏”信息,而是用来**修改或删除**转发给后端服务器的请求头。所谓“隐藏”,实质是通过覆盖、清空或移除特定请求头,防止敏感信息(如真实客户端 IP、内部服务标识等)泄露给上游应用。
控制 X-Real-IP 和 X-Forwarded-For
反向代理时,后端常依赖这些头获取真实客户端 IP。若未正确设置,可能暴露代理层结构或被伪造:
- 用
proxy_set_header X-Real-IP $remote_addr;传递可信的客户端 IP(来自$remote_addr,即直连 Nginx 的地址) - 用
proxy_set_header X-Forwarded-For "";或proxy_set_header X-Forwarded-For $remote_addr;替换原始值,避免链式 IP 堆叠或伪造 - 若后端不需要,可彻底移除:
proxy_set_header X-Forwarded-For "";(注意:空字符串会发送空头,部分后端仍能读到;真正“不发送”需配合underscores_in_headers on;+ 自定义逻辑,但更推荐用map配合条件清除)
屏蔽或重写敏感代理头
Nginx 默认会添加 Host、Connection 等头。某些头(如 Server、X-Powered-By)可能暴露技术栈,虽不由 proxy_set_header 控制,但可通过它干预相关行为:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
- 重写 Host 头确保后端收到预期域名:
proxy_set_header Host $host;或proxy_set_header Host backend.example.com; - 清除可能携带内部信息的自定义头:
proxy_set_header X-Internal-Cluster "";(发送空值,多数后端视同未设置) - 禁用自动添加的
Connection: keep-alive(默认行为),改用:proxy_set_header Connection '';(空字符串可阻止发送该头)
避免传递原始请求头
默认情况下,Nginx 会转发大部分客户端请求头。若不想让后端看到某些头(如 User-Agent、Referer 或认证相关头),应显式覆盖或清空:
-
proxy_set_header User-Agent "Mozilla/5.0";—— 统一 UA,隐藏客户端细节 -
proxy_set_header Authorization "";—— 清除认证头,由 Nginx 统一鉴权后再添加必要凭证 -
proxy_set_header Cookie "";—— 移除 Cookie(谨慎使用,影响登录态),或用map按需过滤特定字段
配合 map 实现动态头控制
静态 proxy_set_header 不够灵活时,可用 map 模块按条件设置或清空头:
- 定义映射:
map $http_x_forwarded_for $safe_xff { default ""; ~^(\d+\.\d+\.\d+\.\d+)$ $1; } - 再使用:
proxy_set_header X-Forwarded-For $safe_xff;—— 只保留合法 IPv4 地址,其余清空 - 类似地,可对
Referer、Origin等做白名单过滤
不复杂但容易忽略:所有 proxy_set_header 指令必须放在 location 或 server 块中 proxy_pass 之前;重复设置以最后一条为准;空字符串值通常能有效“隐藏”对应头内容,但无法完全阻止头被发送——真要彻底不发某头,需结合 Nginx 版本特性(如 1.19.0+ 支持 proxy_hide_header 控制响应头,请求头仍需靠覆盖处理)。










