我正在使用 PHP 构建一个网站,我想将其配置为仅检查客户端的 IPv4,但我遇到一个问题,如果客户端有 IPv6,它就会获取 IPv6。
我使用 $_SERVER['HTTP_X_FORWARDED_FOR'] 获取 IP,但只获取 1 个 IP,并优先获取 IPv6。我只想通过监听 0.0.0.0:80 在 Apache 中接收 IPv4,但它不起作用。请给我一个解决方案
为了确保在 PHP 中仅获取客户端的 IPv4 地址,您可以结合使用 $_SERVER 超全局变量和检查有效的 IPv4 地址。
function getClientIPv4() {
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ipList = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
foreach ($ipList as $ip) {
$ip = trim($ip);
if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
return $ip;
}
}
}
// Fallback to the remote address if no forwarded IP is valid
if (!empty($_SERVER['REMOTE_ADDR']) && filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
return $_SERVER['REMOTE_ADDR'];
}
return null;
}
// Usage
$clientIPv4 = getClientIPv4();
if ($clientIPv4) {
echo "Client's IPv4: " . $clientIPv4;
} else {
echo "No valid IPv4 found.";
}
此函数将检查 HTTP_X_FORWARDED_FOR 和 REMOTE_ADDR 字段中的 IPv4 地址,确保您只获得有效的 IPv4 地址。如果没有找到有效的 IPv4,将返回 null。