我在NGinx下有一个webapp和另一个前端负载平衡器,如下所示(x.x.x.x = IP地址):
Client(a.a.a.a) -> LB (b.b.b.b) -> NGX (c.c.c.c) -> WEBAPP (d.d.d.d)
这是我的NGinx配置的片段:
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
real_ip_header X-Forwarded-For;
set_real_ip_from b.b.b.b;
real_ip_recursive on;
}
X-Forwarded-For
字段X-Forwarded-For
= a.a.a.a
X-Forwarded-For
)在b.b.b.b
header 中搜索客户端真实IP,并将$remote_addr
从b.b.b.b
更改为a.a.a.a
,以便proxy_set_header X-Real-IP $remote_addr
变为真实(确定,这就是我想要的!)但是,NGinx还使用
X-Forwarded-For
IP(而不是a.a.a.a
b.b.b.b
header
X-Forwarded-For
= a.a.a.a, a.a.a.a
X-Real-IP
= a.a.a.a
-> X-Forwarded-For
应该是a.a.a.a, b.b.b.b
我需要的是能够先设置
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
,然后搜索实际IP并替换
$remote_addr
值的功能。
有谁能帮助我解决这个问题?
请您参考如下方法:
$proxy_add_x_forwarded_for
等于$http_x_forwarded_for,$remote_addr
,并且当使用$remote_addr
时,http_realip_module
变量将被更改。因此,您将不会在该 header 中获得最后一个代理地址。因为nginx
配置是声明性的,所以更改指令的顺序不会起作用。
使用http_realip_module时, $realip_remote_addr
变量(nginx >= 1.9.7
)可以用作原始$remote_addr
。因此,您可以像这样设置X-Forwarded-For
header :
proxy_set_header X-Forwarded-For "$http_x_forwarded_for, $realip_remote_addr";