必须同时配置proxy_set_header X-Real-IP $remote_addr、X-Forwarded-For $proxy_add_x_forwarded_for和Host $host,并配合set_real_ip_from与real_ip_header识别可信代理,后端需主动解析对应header而非REMOTE_ADDR。

在 Nginx 中使用 proxy_set_header 透传源站信息,核心是把客户端真实请求的原始字段(如 IP、协议、主机名等)正确附加到转发给后端服务的 HTTP 请求头中,避免后端误判为来自 Nginx 本机。
透传客户端真实 IP(X-Forwarded-For)
默认情况下,后端收到的 Remote-Addr 是 Nginx 的内网地址。要让后端识别真实客户端 IP,需设置:
proxy_set_header X-Forwarded-For $remote_addr;
如果 Nginx 前面还有其他代理(如 CDN 或 LB),建议用更健壮的方式保留完整链路:
-
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;—— 自动追加,不覆盖已有值 - 配合
set_real_ip_from和real_ip_header X-Forwarded-For;可让 Nginx 自身也识别真实 IP(影响$remote_addr)
透传原始请求协议与主机名
后端常依赖 X-Forwarded-Proto 和 X-Forwarded-Host 判断是否启用 HTTPS、生成正确跳转链接:
-
proxy_set_header X-Forwarded-Proto $scheme;—— 传 http 或 https -
proxy_set_header X-Forwarded-Host $host;—— 传请求中的 Host 头(不含端口) -
proxy_set_header X-Forwarded-Port $server_port;—— 如需显式传递端口(尤其非标端口)
避免覆盖或丢失关键原始头信息
Nginx 默认会清除部分请求头(如 Connection、Keep-Alive),若后端依赖特定自定义头或原始头,需显式透传:
-
proxy_set_header X-Original-URI $request_uri;—— 保留带查询参数的原始路径 -
proxy_set_header X-Real-IP $remote_addr;—— 简洁版真实 IP(常用于日志或限流) - 若需透传原始
User-Agent或Referer,通常无需额外设置(Nginx 默认透传),但可显式写为:proxy_set_header User-Agent $http_user_agent;
注意 header 覆盖与作用域问题
同一配置块中重复出现 proxy_set_header 同一名字时,**后定义的会覆盖前一个**;且该指令只对当前 location 或 server 块生效:
- 不要在
http块全局设置X-Forwarded-For后又在某个location里设成固定值,否则可能误传 - 如需不同后端接收不同头,应在对应
location内单独配置 - 确保后端服务实际读取的是你设置的 header 名(例如有些框架默认读
X-Forwarded-For,而非X-Real-IP)


















