我有一个在NGINX和另一个正面的负载平衡器下的webapp,像下面(xxxx = IP地址):
客户端(aaaa) – > LB(bbbb) – > NGX(cccc) – > WEBAPP(dddd)
这是我的NGinxconfiguration的一个片段:
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 bbbb; real_ip_recursive on; }
X-Forwarded-For
字段添加到客户端IP X-Forwarded-For
= aaaa
bbbb
)在$remote_addr
X-Forwarded-For
头中search客户端真实IP,并将$remote_addr
从bbbb
更改$remote_addr
aaaa
这样proxy_set_header X-Real-IP $remote_addr
变为真(OK就是我想要的! aaaa
IP而不是bbbb
来完成X-Forwarded-For
标题 X-Forwarded-For
= aaaa, aaaa
X-Real-IP
= aaaa
X-Forwarded-For
应该是aaaa, bbbb
我需要的是能够设置第一个proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
,然后search真正的IP并replace$remote_addr
值。
任何人都可以帮助我解决这个问题?
这里同样的问题。 这很烦人,我不确定这是功能还是错误:)
我知道这不是一个解决方案,但我已经删除了real_ip_header ,只需使用X-Forwarded-For第一个ipaddress来获取客户端的IP地址,无论我需要它(例如日志)。
$ proxy_add_x_forwarded_for等于“$ http_x_forwarded_for,$ remote_addr”,当http_realip_module正在使用时,$ remote_addr变量将被改变,所以你不会得到那个头部中的最后一个代理地址,改变指令的顺序不会起作用,因为他们只是改变决定nginx如何处理请求的选项。
当http_realip_module正在使用时,$ realip_remote_addr变量可以被用作真实连接的远程地址,你可以像这样设置你的x-forwarded-for头:
proxy_set_header X-Forwarded-For "$http_x_forwarded_for,$realip_remote_addr"
$ realip_remote_addr变量的解释
我最近遇到了同样的“问题”,得出的结论是这个行为是由real_ip_recursive on;
引起的real_ip_recursive on;
指示。
从nginx的realip文档 :
如果启用递归搜索,则与请求标头字段中发送的最后一个不可信地址相匹配的原始客户端地址与其中一个可信地址匹配。
你已经指定信任bbbb
(因为你的set_real_ip_from bbbb;
所以你会期望,即aaaa, bbbb
将被aaaa, aaaa
取代。
这对我来说清楚的来源是: https : //serverfault.com/questions/314574/nginx-real-ip-header-and-x-forwarded-for-seems-wrong