我想向访问者展示他们的IPv4地址,如果他们有IPv6和IPv4地址,我希望它只显示IPv4地址。这是我目前的情况:
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
echo $ip;
如果访问者拥有IPv6地址,上面会显示其中的IPv4地址而不是IPv4地址,我该如何阻止此地址并仅显示其IPv4地址?
答案 0 :(得分:2)
我认为您要求的是不可能的,与IPV4相比,IPV6具有更大范围的有效组合。这简而言之,就是IPV6值不会映射到IPV4
答案 1 :(得分:2)
你的问题没有任何意义。这些天你不能假设每个人都有IPv4地址。
IPv4和IPv6是并行运行的独立协议。用户可以拥有其中一个或两个。
答案 2 :(得分:0)
每个请求只能找到一个客户端IP地址。如果要向客户端显示两个地址,则需要两个请求。这可以使用javascript或iframe来完成。
要做得好,您将需要三个域。
当用户访问主域时,他们的浏览器将决定是使用IPv4还是IPv6。如果使用最新的浏览器,它将在几毫秒内确定哪个协议在此特定连接上更有效。
处理请求时,您会找到两个地址中的一个。然后,您可以包含指向URL的链接,该URL将查找其他系列的地址。请注意,如果用户只能访问两个地址系列中的一个,则会失败。
小心代理。如果您信任来自不受信任的代理的X-Forwarded-For
,则用户可以轻易欺骗任何IP地址。
另请注意,如果是合法代理,您将无法控制客户端和代理之间使用的地址系列。它们完全有可能使用代理,因为客户端机器只有两个系列之一的IP地址,在这种情况下,您不会在另一个系列中找到客户端地址,因为它根本不存在。您仍然可以使用上述方法查找代理的两个地址 - 假设代理实际上允许用户同时访问IPv4和IPv6。
在更高级的配置中,用户甚至可能使用代理来处理某些请求而不是其他请求。因此,您需要准备好处理两个请求中只有一个使用代理的情况。
在大多数情况下,最好的方法是简单地忽略所有代理信息,并仅使用您实际获得请求的IP地址。