【问题标题】:php script to show visitors IPv4 address only仅显示访问者 IPv4 地址的 php 脚本
【发布时间】:2015-05-29 07:11:09
【问题描述】:

我想向我的访问者显示他们的 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 地址。 AFAIK,没有办法说“哦,这个 IPv6 地址映射到这个 IPv4 地址”
  • 这仅适用于同时拥有 IPv4 和 IPv6 的访问者,例如美国的所有 AT&T 客户。我不担心只有 IPv6 地址的访问者。
  • 做一个print_r($_SERVER),看看你的IPv4是否在某处出现。
  • 谢谢,我现在无法检查这个,我使用的是仅 IPv4 的网络连接。任何人都拥有并想要检查这将是很棒的。
  • @Mave 确实有些用户没有 IPv4 地址。但其中绝大多数将可以访问 NAT64,并且他们访问的网站将能够看到 NAT64 的 IPv4 地址。与 NAT44 确实没有什么不同,因为网站也看到 NAT 的 IPv4 地址而不是客户端的地址。

标签: ipv6 ipv4


【解决方案1】:

我认为您的要求是不可能的,与 IPV4 相比,IPV6 的有效组合范围更大。简而言之,这等同于存在不映射到 IPV4 的 IPV6 值

【讨论】:

  • ipchicken.com 只显示我的 ipv4 地址,而上面的脚本只显示我的 ipv6 地址,所以我知道这是可能的。
  • 通常是主机服务器决定您将获得什么。在启用 IPV6 且优先于 IPV4 的启用 IPV6 的主机上托管该脚本时,您将获得一个有意义的 IPV6,因为现在提供越来越多的 IPV6 值而没有等效的 IPV4 值。我在我的域上托管了你的脚本,我得到了 IPV4 格式,我有一个朋友测试它,他使用的是纯 IPV6,他得到一个空白信息。在我的云主机上,他得到了他的 IPV6 地址,而我得到了我的 IPV4 地址
  • 这很有意义。因此,如果我从只有 IPv4 地址而没有 IPv6 地址的服务器托管脚本,它只会显示 IPv4。是的,确实非常合乎逻辑。谢谢!
【解决方案2】:

你的问题没有任何意义。你不能假设现在每个人都有一个 IPv4 地址。

IPv4 和 IPv6 是并行运行的独立协议。一个用户可以同时拥有一个或两个。

【讨论】:

    【解决方案3】:

    每个请求只能找到一个客户端 IP 地址。如果要向客户端显示两个地址,则需要两个请求。这可以使用 javascript 或 iframe 来完成。

    要正确执行此操作,您将需要三个域。

    • 具有双堆栈的主域
    • 仅限 IPv4 的域。
    • 仅限 IPv6 的域。

    当用户访问主域时,他们的浏览器将决定是使用 IPv4 还是 IPv6。如果正在使用最新的浏览器,它会在几毫秒内确定哪种协议在此特定连接上更有效。

    当您处理请求时,您会找到两个地址之一。然后,您可以包含一个指向 URL 的链接,该 URL 将找到另一个家庭的地址。请注意,如果用户只能访问两个地址系列之一,这将失败。

    小心代理。如果您信任来自不受信任的代理的X-Forwarded-For,则用户可以轻松地欺骗任何 IP 地址。

    另请注意,如果是合法代理,您将无法控制客户端和代理之间使用的地址族。他们完全有可能使用代理,因为客户端机器只有两个系列之一的 IP 地址,在这种情况下,您不会在另一个系列中找到客户端地址,因为它根本不存在.您仍然可以使用上述方法找到代理的两个地址 - 假设代理实际上允许用户访问 IPv4 和 IPv6。

    在更高级的配置中,用户甚至可以对某些请求使用代理,而不是对其他请求。因此,您需要准备好处理两个请求中只有一个使用代理的情况。

    在大多数情况下,最好的方法是简单地忽略所有代理信息,只使用您实际收到请求的 IP 地址。

    【讨论】:

    • 我只是从一个只有 IPv4 地址的 OpenVZ 服务器上构建了上面的 php 脚本,它只显示一个 IPv4 地址。不过,感谢您的洞察力,非常有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 2023-04-11
    • 2013-12-12
    • 2012-01-28
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多