如果有人通过IPv4或IPv6连接到我的网站,我想通过php查看。
客户端地址可以在$_SERVER["REMOTE_ADDR"]
中找到,但如何检查它是IPv4还是IPv6?
答案 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_vars
和list 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 extension:constants (请参阅页面末尾)似乎与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';
}
?>