如何使用 PHP 代码同时获取 IPv4 和 IPv6 地址?

问题描述 投票:0回答:4

我有一个向另一台服务器发送请求的脚本,但问题是

IPv6
不支持,所以如果我发送
IPv6
然后给出错误,所以我需要两个之一:

  1. 随时获取
    IPv4
    地址 或
  2. 获取
    IPv4
    IPv6
    地址

我使用此代码来获取

IP
地址

function getRealIP()
    {
        if (isset($_SERVER["HTTP_CLIENT_IP"])) {
            $ip = $_SERVER["HTTP_CLIENT_IP"];
        } elseif (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
            $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
        } elseif (isset($_SERVER["HTTP_X_FORWARDED"])) {
            $ip = $_SERVER["HTTP_X_FORWARDED"];
        } elseif (isset($_SERVER["HTTP_FORWARDED_FOR"])) {
            $ip = $_SERVER["HTTP_FORWARDED_FOR"];
        } elseif (isset($_SERVER["HTTP_FORWARDED"])) {
            $ip = $_SERVER["HTTP_FORWARDED"];
        } else {
            $ip = $_SERVER["REMOTE_ADDR"];
        }

        // Strip any secondary IP etc from the IP address
        if (strpos($ip, ',') > 0) {
            $ip = substr($ip, 0, strpos($ip, ','));
        }
        return $ip;
    }

但是这个函数只返回一个

IPv
地址。我怎样才能获得所有时间
IPv4
或获得两个地址?

php ip ipv6 ipv4
4个回答
16
投票

客户端将仅使用一种协议向您的服务器发送请求。它不会同时使用 IPv4 和 IPv6 发送请求,并且无法交错这两种协议,而且 IPv4 地址也不会转换为等效的 IPv6 地址。如果客户端使用 IPv4 发送请求,那么您将获得 IPv4 地址。如果他们使用 IPv6 发送请求,您将获得 IPv6 地址。时期。故事结束。 如果您

需要

IPv4 地址,则必须在服务器/DNS 条目上禁用 IPv6 支持,因此所有客户端都被迫使用 IPv4 作为唯一可用的协议。但在当今时代,这也将是可怕的倒退。


12
投票

只有请求来源的 IP 地址可用。

没有可靠的方法来识别路由到同一台计算机的其他 IP 地址(我的笔记本电脑当前有 12 个 IP 地址)。


0
投票

我用它来获取我的公共 WAN_IPv4 和公共 WAN_IPv6,通过一个简单的 Cron 作业每 xx 分钟触发一次并更新我的 DNS 记录之一

为什么不上一层查询主机名 NS A 和 AAAA 记录本身呢?

$ dig dom.domain -A | grep "ip ..." [with some some regex to extract specific pattern.]

或者结合使用多种方法,甚至可以使用curl来获取-ipv4地址,然后使用直接调用“ping”myip6.php脚本来返回IPv6。?

或者通过 cURL 接口上的 dns 解析来保持简单

$ curl --help all ... --dns-interface <interface> Interface to use for DNS requests --dns-ipv4-addr <address> IPv4 address to use for DNS requests --dns-ipv6-addr <address> IPv6 address to use for DNS requests --dns-servers <addresses> DNS server addrs to use ... --interface <name> Use network INTERFACE (or address) -4, --ipv4 Resolve names to IPv`enter code here`4 addresses -6, --ipv6 Resolve names to IPv6 addresses ...

如果使用curl,您可以指定选项 
-4

-6 来指示哪个IP堆栈返回其结果 $ curl -4 dom.domain OUTPUT: > 255.255.255.255

可以使用 
-6

IPv6 进行同样的操作 $ curl -6 dom.domin OUTPUT: > 20a1:efef:ffff::0

当然可以将以上内容通过管道输出到控制台或存储在 
_VAR

中以供以后使用。 我的意思是,这不是回答您的具体问题的直接方法,但它确实为您提供了管理双 ipstack 机器时的选择,这也是我所做的。

还有一个很好的例子说明如何使用curl来完成这项工作[name-resolve-tricks-with-c-ares][1] [1]:https://everything.curl.dev/usingcurl/connections/name#name-resolve-tricks-with-c-ares


0
投票

<?php $ipv4 = $_GET['ipv4'] ?? ""; $ipv6 = $_GET['ipv6'] ?? ""; $ip = $_SERVER['REMOTE_ADDR']; if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { $ipv4 = $ip; } elseif (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { $ipv6 = $ip; } echo "Your IPv4 is: $ipv4 <br>"; echo "Your IPv6 is: $ipv6 <br>"; // Redirect user to this page with the other IP version if one is missing if($ipv4 == ""){ header("Location: http://127.0.0.1/ip.php?ipv6=$ipv6"); } if($ipv6 == ""){ header("Location: http://[::1]/ip.php?ipv4=$ipv4"); } ?>

但是您应该谨慎使用此代码,因为它不提供 IP 地址验证,不处理重定向循环,并且不考虑用户无法通过 IPv6(甚至 IPv4)进行访问的情况。

您还需要配置您的网络服务器才能使用它。

© www.soinside.com 2019 - 2024. All rights reserved.