代表客户端IP。注意,这里的客户端指的是直接请求Nginx的客户端,非间接请求的客户端。假设用户请求过程如下:
那么,默认情况下,针对Nginx1而言,<code>$remote_addr</code>为用户客户端IP,对Nginx2而言,<code>$remote_addr</code>则为Nginx1的IP。此时如果希望Nginx2也可以获取用户客户端IP,那要怎么处理呢?答案如下:
在Nginx1配置文件中使用<code>proxy_set_header</code>为转发请求设置请求头
然后,在Nginx2 配置文件中通过<code>$http_x_real_ip</code>来获取<code>X-Real-IP</code>请求头的值来获取真实客户端IP.
此时,如果要求“后端服务器”也要获取用户客户端IP,咋处理呢?做法和上述类似,在Nginx2配置文件中,使用<code>proxy_set_header</code>做同样的配置,即:
然后,“后端服务器”获取请求头“X-Real-IP”的值即为用户客户端IP。
很多HTTP代理会在HTTP协议头中添加<code>X-Forwarded-For</code>头,用来追踪请求的来源。<code>X-Forwarded-For</code>的格式如下:
<code>X-Forwarded-For</code>包含多个IP地址,每个值通过逗号+空格分开,最左边(client1)是最原始客户端的IP地址,中间如果有多层代理,每一层代理会将连接它的客户端IP追加在<code>X-Forwarded-For</code>右边。
代表附加<code>$remote_addr</code>变量的客户端请求头<code>X-Forwarded-For</code> ,其值如果包含多个地址,用逗号+空格分隔,标准格式如下:
如果<code>X-Forwarded-For</code>字段没出现在客户端请求头,<code>$proxy_add_x_forwarded_for</code> 等同于<code>$remote_addr</code> 变量。
这里,假设用户请求过程和上文所述一样,如下:
假设,仅在Nginx1配置文件中进行了以下配置
那么,Nginx2配置的<code>X-Forwarded-For</code>请求头的值即为<code>clientIP</code>,当然,这个结论的前提是,客户端IP没有配置<code>X-Forwarded-For</code>请求头,因为如上所述,客户端没有出现这个请求头时,<code>$proxy_add_x_forwarded_for</code> 的值即为<code>$remote_addr</code> 变量的值,否则,则是客户端为<code>X-forwarded-for</code>请求头的实际值。
接着,假设Nginx2配置文件也进行以下配置
那么,“后端服务器”获取的<code>X-Forwarded-For</code>请求头的值将为<code>clientIP, Nginx1IP</code>。也就是说以上命令的执行是个叠加的过程(类似Python的列表的<code>append</code>方法的处理过程),可以简单理解为如果存在上级代理,执行以上命令时,会把上级代理IP追加到X-Forwarded-For请求头总,否则把客户端IP <code>$remote_addr</code>、或者客户端<code>X-Forwarded-For</code>请求头的值(如果有的话)追加到X-Forwarded-For请求头中。
参考连接:
https://nginx.org/en/docs/http/ngx_http_core_module.html#var_remote_addr
https://nginx.org/en/docs/http/ngx_http_proxy_module.html#var_proxy_add_x_forwarded_for
作者:授客
QQ:1033553122
全国软件测试QQ交流群:7156436
Git地址:https://gitee.com/ishouke
友情提示:限于时间仓促,文中可能存在错误,欢迎指正、评论!
作者五行缺钱,如果觉得文章对您有帮助,请扫描下边的二维码打赏作者,金额随意,您的支持将是我继续创作的源动力,打赏后如有任何疑问,请联系我!!!
微信打赏
支付宝打赏 全国软件测试交流QQ群
