获取用户真实ip

来源:5-7 Nginx常见问题_如何获取用户真实的ip信息

qq_男仔头_0

2018-05-28

http://img.mukewang.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 这样是否可以的呢?谢谢


写回答

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

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

//img.mukewang.com/szimg/5b0d749d0001984b08900206.jpg


0
2
Jeson
回复
qq_男仔头_0
你好,问题1:可以的,使用http_x_forwarded_for的这种方式也是可以获取到用户真实IP。 问题2、不是这个意思,第二级代理上,需要作的就是转发头信息,将第一级代理上已经添加好的头信息,完整转发就好了,第二级代理不用再改写或者设置这样就不准了。
2018-05-30
共2条回复

Nginx入门到实践-Nginx中间件应用+搭建Webserver架构

中间件、负载均衡、应用层安全防护、动静分离、Nginx+LUA开发等

4183 学习 · 908 问题

查看课程