请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

获取用户真实ip

https://img1.sycdn.imooc.com//szimg/5b0c20460001541e08230297.jpg

老师您好!
问题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 这样是否可以的呢?谢谢


正在回答 回答被采纳积分+3

1回答

Jeson 2018-05-29 23:43:07

你好,对于你的问题,我分别回答如下:

问题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设置。

这个图里这个地方,是个伪代码。

//img1.sycdn.imooc.com//szimg/5b0d749d0001984b08900206.jpg


0 回复 有任何疑惑可以回复我~
  • 提问者 qq_男仔头_0 #1
    老师您好,现在还有些疑惑:
    1、获取用户真实ip用老师之前所讲到的http_x_forwarded_for 可以吗?它也是记录的格式是客户端ip,proxy1,proxy2 那么按这个的话是不是也可以获取客户端真实ip?
    
    2、按照老师说讲的:从第一级代理开始就通过proxy_set_header x-real-ip $remote_addr的方式,固定一个变量x_real_ip,将用户的IP信息就传入到这个请求头的变量中,并且一级一级的传,直到后端。这样后端的服务,通过获取x_real_ip就能直接获取到用户信息。所以,那么这个配置方式(x_real_ip=$remote_addr)在所有的请求经过的代理上都需要配置。
    
    比如我代理2也设置proxy_set_header x-real-ip $remote_addr 那此时 $remote_addr这个地址不就是 代理1的ip吗,这个不就把 x-real-ip之前保存的客户真实ip的值冲掉了吗? 请老师指点一下,谢谢!!
    回复 有任何疑惑可以回复我~ 2018-05-30 10:15:34
  • Jeson 回复 提问者 qq_男仔头_0 #2
    你好,问题1:可以的,使用http_x_forwarded_for的这种方式也是可以获取到用户真实IP。
    问题2、不是这个意思,第二级代理上,需要作的就是转发头信息,将第一级代理上已经添加好的头信息,完整转发就好了,第二级代理不用再改写或者设置这样就不准了。
    回复 有任何疑惑可以回复我~ 2018-05-30 10:41:46
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信