在PHP中获取请求的真实IP地址通常涉及到处理HTTP请求头中的X-Forwarded-For、X-Real-IP等字段。这些字段通常由代理服务器或负载均衡器设置,用于指示原始客户端的IP地址。
$_SERVER全局变量直接获取客户端IP。X-Forwarded-For、X-Real-IP等代理头信息获取真实IP。function getRealIp() {
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$ip = trim($ips[0]);
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
return $ip;
}
$realIp = getRealIp();
echo "Real IP: " . $realIp;原因:当请求经过代理服务器时,代理服务器会在请求头中添加X-Forwarded-For或X-Real-IP字段,但这些字段可能被多个代理服务器篡改。
解决方法:
X-Forwarded-For字段。REMOTE_ADDR:如果不需要处理代理服务器的情况,可以直接使用$_SERVER['REMOTE_ADDR']获取客户端IP。function getRealIp() {
if (!empty($_SERVER['HTTP_CLIENT_IP']) && in_array($_SERVER['HTTP_CLIENT_IP'], ['127.0.0.1', '::1'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$ip = trim($ips[0]);
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
return $ip;
}通过以上方法,可以有效地获取请求的真实IP地址,并解决常见的问题。