Nginx负责接收用户的请求并将其转发至Web应用,这个过程通常被称为反向代理。在这个过程中,用户的IP地址原本存储在网络包的源IP地址字段中。当抵达Nginx服务器时,IP保存的是你的Nginx服务器地址,而真正的用户IP则会丢失。 但幸运的是,Nginx会把用户IP放进一个叫做X-Real-IP的HTTP头里。

想象一下网络请求就像一位信使。他承载着我们的信件穿梭在网海之中,寻找着目的地。这个信使在他的背包里,是荷载着请求信息的信件,这就是HTTP请求。而在信件的无数封口,标记着许多关于信件的信息,这就是HTTP头。这个X-Real-IP就像是一种特殊的邮票,标明了信件的真实来源。

那么,如何才能在Web应用中获取到这个X-Real-IP呢?

理解怎么取用X-Real-IP,其实是要看你的Web应用是用什么语言编写的。比如说Python,如果你在Django或者Flask框架下工作,那么你可以这么写:

user_ip = request.META.get('HTTP_X_REAL_IP')

或者

user_ip = request.headers.get('X-Real-IP')

上述这两行代码,就是在邮件中取出特殊邮票的过程。

对,没错。就这么简单。

但是所有事情总是有例外的。例如,你网站的用户是通过VPN或者代理服务器访问的,那么这个X-Real-IP给出的只是VPN或者代理服务器的地址,而不是用户的真实IP。幸运的是,这个问题也可以解决。 Nginx在代理请求的时候,除了在HTTP头添加X-Real-IP外,还会添加一项名为X-Forwarded-For的头,里面接连着所有曾经代理这个请求的服务器的IP。

有点像在查快递的时候一样,上面显示了整个快递的流转情况,每一个分拣点,每一次转运,都清清楚楚。这个X-Forwarded-For列表的最后一个IP,就是用户的真实IP。

在Python中,我们可以这么获取:

x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
    user_ip = x_forwarded_for.split(',')[-1].strip()
else:
    user_ip = request.META.get('HTTP_X_REAL_IP')

这么写,就既考虑了直连的情况,又顾及了代理的场景。

至此,我们已经可以完美地获取到用户的真实IP地址了。就像我们可以现在的快递体系中找到每一处流转的痕迹一样。金无足赤人无完人,以上方法仍有缺陷,例如用户使用的是复杂的代理网络或者恶意修改请求头信息,这将造成我们无法获取到真实的用户IP。

但总的来说,通过理解网络通信的基础知识,了解http协议以及nginx的工作方式,我们已经能在大多数情况下准确地获取用户的真实IP地址了,在调试问题或者记录日志时会起到很大的帮助。

这就像你现在坐在邮局,手里拿着一份邮递记录,可以清晰地看到每一个包裹的来龙去脉,原来,它们都是那么地有趣,有意义。

云服务器推荐

蓝易云国内/海外高防云服务器推荐


海外免备案云服务器链接:www.tsyvps.com

持有增值电信营业许可证:B1-20222080【资质齐全】

蓝易云香港五网CN2 GIA/GT精品网络服务器。拒绝绕路,拒绝不稳定。


百度搜索:蓝易云

蓝易云是一家专注于香港及国内数据中心服务的提供商,提供高质量的服务器租用和云计算服务、包括免备案香港服务器、香港CN2、美国服务器、海外高防服务器、国内高防服务器、香港VPS等。致力于为用户提供稳定,快速的网络连接和优质的客户体验。
最后修改:2023 年 11 月 05 日
如果觉得我的文章对你有用,请随意赞赏