php项目有负载,$_SERVER['HTTP_X_FORWARDED_FOR']函数在不一样系统中获取到的值形式不同,ios系统苹果手机只能获取到一个ip(113.87.214.xxx),而安卓手机

此次因为有个抽奖活动功能,苹果手机每次都抽奖失败,安卓手机每次都抽奖失败(5台ios手机,8台Android手机)。php

错误日志查看是由于,抽奖用户的ip记录进数据库时出错,以前都是拿到ip直接插入数据库,没有作校验ios

由于安卓获取到了2个ip,因此就会插不进去,至于为何会出现2个ip,其实还可能出现更多的ip数据库

看过这篇文章后,疑惑解开了80% ,文章url是(https://zh.m.wikipedia.org/zh-cn/X-Forwarded-For)缓存

里面有讲到以下(部份内容):服务器

X-Forwarded-For

X-Forwarded-ForXFF)是用来识别经过HTTP代理负载均衡方式链接到Web服务器的客户端最原始的IP地址的HTTP请求头字段。 Squid 缓存代理服务器的开发人员最先引入了这一HTTP头字段,并由IETF在HTTP头字段标准化草案[1]中正式提出。负载均衡

当今多数缓存服务器的用户为大型ISP,为了经过缓存的方式来下降他们的外部带宽,他们经常经过鼓励或强制用户使用代理服务器来接入互联网。有些状况下,这些代理服务器是透明代理,用户甚至不知道本身正在使用代理上网。ui

若是没有XFF或者另一种类似的技术,全部经过代理服务器的链接只会显示代理服务器的IP地址,而非链接发起的原始IP地址,这样的代理服务器实际上充当了匿名服务提供者的角色,若是链接的原始IP地址不可得,恶意访问的检测与预防的难度将大大增长。XFF的有效性依赖于代理服务器提供的链接原始IP地址的真实性,所以,XFF的有效使用应该保证代理服务器是可信的,好比能够经过建立可信服务器白名单的方式。url

目录

格式编辑

这一HTTP头通常格式以下:spa

X-Forwarded-For: client1, proxy1, proxy2

其中的值经过一个 逗号+空格 把多个IP地址区分开, 最左边(client1)是最原始客户端的IP地址, 代理服务器每成功收到一个请求,就把请求来源IP地址添加到右边。 在上面这个例子中,这个请求成功经过了三台代理服务器:proxy1, proxy2 及 proxy3。请求由client1发出,到达了proxy3(proxy3多是请求的终点)。请求刚从client1中发出时,XFF是空的,请求被发往proxy1;经过proxy1的时候,client1被添加到XFF中,以后请求被发往proxy2;经过proxy2的时候,proxy1被添加到XFF中,以后请求被发往proxy3;经过proxy3时,proxy2被添加到XFF中,以后请求的的去向不明,若是proxy3不是请求终点,请求会被继续转发。代理

鉴于伪造这一字段很是容易,应该谨慎使用X-Forwarded-For字段。正常状况下XFF中最后一个IP地址是最后一个代理服务器的IP地址, 这一般是一个比较可靠的信息来源。

 

看完这部分,已经讲解的很清楚了,http协议就是这么定义的  X-Forwarded-For: client1, proxy1, proxy2

可是仍是有20%没有获得解开 ,为何只有安卓手机会获得 client1, proxy1, proxy2 这样多个ip的形式 ,而苹果手机获得的只有一个ip

相关文章
相关标签/搜索