如何知道客户端在连接到我的服务器时使用的是哪个版本的Internet协议(IP)?

时间:2009-09-19 16:19:18

标签: php

如果有人通过IPv4或IPv6连接到我的网站,我想通过php查看。

客户端地址可以在$_SERVER["REMOTE_ADDR"] 中找到,但如何检查它是IPv4还是IPv6?

7 个答案:

答案 0 :(得分:37)

检查IPv4

$ip = "255.255.255.255";
if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {    
    echo "Valid IPv4";
}
else {
    echo "Invalid IPv4";
}

检查IPv6

$ip = "FE80:0000:0000:0000:0202:B3FF:FE1E:8329";    
if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
    echo "Valid IPv6";
}
else {
    echo "Invalid IPv6";
}

有关更多信息,请查看PHP函数filter_varslist of filters for validation

答案 1 :(得分:24)

您可以使用:

function ipVersion($txt) {
     return strpos($txt, ":") === false ? 4 : 6;
}

答案 2 :(得分:6)

如何计算'.':和/或“$_SERVER["REMOTE_ADDR"]”的数量?

如果:中有超过0个“.”且没有“$_SERVER["REMOTE_ADDR"]”符号,我认为您可以认为用户是通过IPv6连接的。


另一种解决方案可能是使用filter extensionconstants (请参阅页面末尾)似乎与IPv4和IPv6相关:

  

FILTER_FLAG_IPV4(整数)
允许   “validate_ip”中只有IPv4地址   过滤

     

FILTER_FLAG_IPV6(整数)
允许   “validate_ip”中只有IPv6地址   过滤

答案 3 :(得分:5)

您可以使用inet_pton

<?php

$packedIp = @inet_pton($ip);

if ($packedIp === false) {
    // invalid IP
} else if (isset($packedIp[4])) {
    // IPv6
} else {
    // IPv4
}

答案 4 :(得分:4)

由于最高投票答案有一个相当重要的问题,我将分享我自己的答案。

如果传入似乎是IPv6的地址,则返回true;如果传入似乎是IPv4(或IPv4映射的IPv6)的地址,则返回false。实际地址不会被进一步验证;如果您需要验证它们,请使用filter_var()

function is_ipv6($address) {
    $ipv4_mapped_ipv6 = strpos($address, "::ffff:");
    return (strpos($address, ":") !== FALSE) &&
           ($ipv4_mapped_ipv6 === FALSE || $ipv4_mapped_ipv6 != 0);
}

答案 5 :(得分:2)

IPv4地址全部与正则表达式/^\d{1,3}(\.\d{1,3}){3,3}$/匹配。

答案 6 :(得分:2)

您可以使用AF_INET6来检测PHP是否使用IPv6支持进行编译:

<?php
if ( defined('AF_INET6') ) {
    echo 'Yes';
} else {
    echo 'No';
}
?>