35 php
我想通过php检查是否有人通过IPv4或IPv6连接到我的网站.
可以找到客户端地址,$_SERVER["REMOTE_ADDR"] 但如何检查它是IPv4还是IPv6?
Muk*_*ain 41
检查IPv4
$ip = "255.255.255.255";
if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
echo "Valid IPv4";
}
else {
echo "Invalid IPv4";
}
Run Code Online (Sandbox Code Playgroud)
检查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";
}
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请查看PHP函数filter_vars和list of filters for validation.
Cem*_*ncu 25
你可以用这个:
function ipVersion($txt) {
return strpos($txt, ":") === false ? 4 : 6;
}
Run Code Online (Sandbox Code Playgroud)
计算'.'和/或' :' 的数量怎么样$_SERVER["REMOTE_ADDR"]?
如果有超过0' :'且没有' .'符号$_SERVER["REMOTE_ADDR"],我想您可以认为您的用户是通过IPv6连接的.
另一个解决方案可能是使用过滤器扩展:有一些似乎与IPv4和IPv6相关的常量 (参见页面末尾):
FILTER_FLAG_IPV4(整数)
仅允许"validate_ip"过滤器中的IPv4地址.
FILTER_FLAG_IPV6(整数)
仅允许"validate_ip"过滤器中的IPv6地址.
你可以使用inet_pton:
<?php
$packedIp = @inet_pton($ip);
if ($packedIp === false) {
// invalid IP
} else if (isset($packedIp[4])) {
// IPv6
} else {
// IPv4
}
Run Code Online (Sandbox Code Playgroud)