获取用户真实ip
来源:5-7 Nginx常见问题_如何获取用户真实的ip信息
qq_男仔头_0
2018-05-28
老师您好!
问题1:在课程中如上图:
在代理1上通过set x_real_ip=$remote_addr 获取到用户的ip, 那么我在代理二上的透传方式是如何做的?是通过http_x_forwarded_for去实现吗?就是在比如代理二上 配置 set x_real_ip http_x_forwarded_for?
问题2:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for X-Forwarded-For是一个变量吧,这个变量的话名称是否可以改为其他的?比如写成proxy_set_header xff $proxy_add_x_forwarded_for 这样是否可以的呢?谢谢
1回答
-
Jeson
2018-05-29
你好,对于你的问题,我分别回答如下:
问题1、我们需要透传的IP,一定是有作用的IP。如:企业中很多场景我们希望获取到用户的真实IP信息,那么实际的场景中有的时候获取不到这些真实的信息,为什么?其中的原因有很多,最常见的一种原因就是用户发起过来的请求经过了很多的代理,导致后台服务默认的情况下只能获取到最近的一个代理服务器的IP地址,所以我们需要想办法让用户真实的IP信息透传。
那么怎么透传呢?你想想用户过来的HTTP请求可以分为请求体(也就是Body)和请求头(也就是Head),我们不可能去改请求体,因为会影响用户的请求,所以只能通过修改请求头,并且一级一级的约定,从第一级代理开始就通过proxy_set_header x-real-ip $remote_addr的方式,固定一个变量x_real_ip,将用户的IP信息就传入到这个请求头的变量中,并且一级一级的传,直到后端。这样后端的服务,通过获取x_real_ip就能直接获取到用户信息。
所以,那么这个配置方式(x_real_ip=$remote_addr)在所有的请求经过的代理上都需要配置。
问题2、这个改成别的变量是可以的,不过你需要x-forwarded-for是http协议中常见的head头,也是http协议的约定方式,也就是一个约定,并不是一个约束。
最后,还需要说明下,Nginx像后端的节点添加头信息用proxy_set_header。如果Nginx向前端返回添加头用set设置。
这个图里这个地方,是个伪代码。
022018-05-30
相似问题