在开启CDN后,如何利用PHP获取用户真实IP的方法
/**
* 获取 CDN 后的真实客户端 IP
* 优先级:CDN 专用头 > X-Forwarded-For 首段 > X-Real-IP > REMOTE_ADDR
*/
function getRealClientIp()
{
$ipHeaders = [
'Ali-CDN-Real-IP', // 阿里云
'TX-Client-IP', // 腾讯云
'CF-Connecting-IP', // Cloudflare
'X-Real-IP', // 又拍云/Nginx
'Client-IP', // 百度云
'X-Forwarded-For', // 通用(需取首段)
];
foreach ($ipHeaders as $header) {
if (!empty($_SERVER['HTTP_' . strtoupper(str_replace('-', '_', $header))])) {
$ip = $_SERVER['HTTP_' . strtoupper(str_replace('-', '_', $header))];
// X-Forwarded-For 可能是逗号分隔的链,取第一个(最近代理)
if ($header === 'X-Forwarded-For') {
$ip = trim(explode(',', $ip)[0]);
}
// 验证 IP 格式
if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
return $ip;
}
}
}
// 兜底:直接连接 IP(无 CDN 时)
return $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0';
}
相关文章