我有一个脚本发送请求到另一个服务器,但问题是IPv6
不支持,所以如果我发送IPv6
,然后给予错误,所以我需要这两个之一:
1.始终获取IPv4
地址或
1.获取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
或者两个地址?
3条答案
按热度按时间xzlaal3s1#
客户端只会使用一种协议向服务器发送请求。它不会同时使用IPv4和IPv6发送请求,也无法交叉使用两种协议,而且IPv4地址也不会转换为等效的IPv6地址。如果客户端使用IPv4发送请求,那么您将获得IPv4地址。如果客户端使用IPv6发送请求,你就能得到IPv6地址。就这样。故事结束。
如果你需要一个IPv4地址,那么你必须在你的服务器/DNS条目上禁用IPv6支持,这样所有的客户端都被迫使用IPv4作为唯一可用的协议。但在这个时代,这也是一个可怕的倒退。
guykilcj2#
你不能。
只有发出请求的IP地址可用。
没有可靠的方法来识别路由到同一台计算机的其他IP地址(我的笔记本电脑目前有12个IP地址)。
jgwigjjp3#
这只是一个想法,但可能诀窍在于客户机如何查询服务器。
它是我用来获得我的公共WAN_IPv4和公共WAN_IPv6与一个简单的Cron作业,以消防每xx分钟,并更新我的DNS记录之一
为什么不向上一层查询主机名NS A和AAAA记录呢?
或者结合使用这些方法,甚至可以使用curl获取-ipv4地址,然后使用直接调用“ping”myip6.php脚本以返回IPv6。
或者通过DNS解析与cURL的接口来保持简单
如果使用curl,您可以指定选项**-4*和***-6来指示哪个IP堆栈返回其结果
使用**-6可对IPv6**执行相同操作
当然,上述内容可以通过管道传输到任一控制台或存储在 _VAR 中以供以后使用。
我的意思是,这不是一个直接的方法来回答你的具体问题,但它确实给予你的选择时,管理双ipstack机器和它的我做什么。
这里还有一个很好的例子来说明如何使用curl来完成这个任务[name-resolve-tricks-with-c-ares][1] [1]:https://everything.curl.dev/usingcurl/connections/name#name-resolve-tricks-with-c-ares