
在PHP Web开发中,准确获取客户端真实IP地址对日志记录、访问控制、安全防护等场景至关重要。由于网络环境复杂(如代理服务器、CDN转发),需结合服务器环境变量综合判断,以下为专业实现方案。
PHP通过$_SERVER超全局数组获取IP相关信息,核心变量包括:REMOTE_ADDR(直接连接服务器的客户端IP,最基础可靠)、HTTP_CLIENT_IP(部分代理设置的客户端IP)、HTTP_X_FORWARDED_FOR(多层代理时记录原始IP,格式为"IP1,IP2...")。需注意,非REMOTE_ADDR的变量均可被客户端伪造,需谨慎验证。
可靠获取真实IP的逻辑应优先检查代理相关头信息,再以REMOTE_ADDR兜底,同时过滤无效值与内网IP。以下为标准化实现:
function getClientIp() {
$ipSources = [
'HTTP_X_FORWARDED_FOR',
'HTTP_CLIENT_IP',
'HTTP_X_REAL_IP',
'REMOTE_ADDR'
];
foreach ($ipSources as $key) {
if (!empty($_SERVER[$key])) {
$ips = explode(',', $_SERVER[$key]);
foreach ($ips as $ip) {
$ip = trim($ip);
if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
return $ip;
}
}
}
}
return isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '0.0.0.0';
}关键说明:使用FILTER_VALIDATE_IP配合FILTER_FLAG_NO_PRIV_RANGE(排除内网IP)和FILTER_FLAG_NO_RES_RANGE(排除保留IP)过滤非法值;X-Forwarded-For含多个IP时取首个有效公网IP;最终以REMOTE_ADDR确保返回值不为空。
注意事项:若服务部署于CDN或负载均衡后,需在服务器配置中信任代理传递的头信息(如Nginx设置proxy_set_header X-Real-IP $remote_addr;),避免直接使用未经验证的客户端输入。生产环境中建议结合日志审计,验证IP获取逻辑的可靠性。