REMOTE_ADDR
表示发出请求的远程主机的 IP地址,
remote_addr代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的
当你的浏览器访问某个网站时,
- 假设中间没有任何代理,那么网站的web服务器就会把remote_addr设为你的机器IP,
- 如果你用了某个代理(nginx代理,api网关等),那么你的浏览器会先访问这个代理,然后再由这个代理转发到网站,这样web服务器就会把remote_addr设为这台代理机器的IP
HTTP_X_FORWARDED_FOR
- 简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项,正如上面所述,当你使用了代理时,web服务器就不知道你的真实IP了,为了避免这个情况,代理服务器通常会增加一个叫做x_forwarded_for的头信息,把连接它的客户端IP(即你的上网机器IP)加到这个头信息里,这样就能保证网站的web服务器能获取到真实IP
- 如果存在多级代理,那么x_forwarded_for将会存储多个值,中间用英文逗号隔开 如:‘192.168.2.12,53.33.2.12’。
示例代码
if request.META.get('HTTP_X_FORWARDED_FOR'):
ip = request.META.get('HTTP_X_FORWARDED_FOR')
else:
ip = request.META.get('REMOTE_ADDR')
# 当有多级代理时,HTTP_X_FORWARDED_FOR返回多个IP,取第一个即可。
if ip:
ip = request.split(',')[0]