美好的一天,
我在PHP中使用以下代码来获取IP地址:
$IPkey = array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR');
foreach($IPkey as $name){
if(isset($_SERVER[$name])) return $_SERVER[$name];
}
现在有了一个客户,我得到了非常尴尬的结果。
我突然得到以下结果:
客户声称他仅在单台PC上使用系统。我当然敢怀疑这一说法。
但是我根本无法对这些IP地址有任何了解。 就像将IPv4地址附加到IPv6地址上一样。
我希望任何人都可以告诉我他们的真实IP是什么,这是他们的内部地址粘贴到他们的路由器地址吗?以及如何避免这种情况?
编辑:我将尝试再次解释。我使用上面提到的代码来获取IP地址。
现在我得到的结果与上面的类似。看起来像我 意思是:
2001:1c04:3403:9bf0:a8a6:2d21:8006:159 AND 172.69.55.30
但是我得到一个完整的字符串: 2001:1c04:3403:9bf0:a8a6:2d21:8006:159, 172.69.55.30 就像这样的IP地址。在我看来,可能性很小。但这仍然是返回给我的东西。
我想知道为什么会这样吗?
答案 0 :(得分:2)
“键”的顺序很重要。因此,即使您确实需要远程地址,您也常常以HTTP_X_FORWARDED_FOR
结尾。我认为这是您正在寻找的。它的值是与HTTP请求一起发送的HTTP标头的值。
HTTP_X_FORWARDED_FOR
可以包含多个IP地址。当一个请求通过一个以上的代理服务器链接时,每个代理都应将前一个的IP添加到现有的X-Forwarded-For标头中,以便保留整个链。语法为:
X-Forwarded-For: <client>, <proxy1>, <proxy2>
请参阅:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Forwarded-For
由于IPv4和IPv6地址都不包含逗号,因此可以查找逗号以查看是否有多个IP地址。如果这样做,则可以采用第一个客户端计算机的IP地址,也可以采用最后一个作为连接通过的最后一个代理。