public static function getClientIp()
{
if(isset($_SERVER['HTTP_X_REAL_IP'])){
return $_SERVER['HTTP_X_REAL_IP'];
}
$onlineip = 'Unknown';
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ips = explode(",", $_SERVER['HTTP_X_FORWARDED_FOR']);
$real_ip = $ips['0'];
if ($_SERVER['HTTP_X_FORWARDED_FOR'] && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $real_ip)) {
$onlineip = $real_ip;
} elseif ($_SERVER['HTTP_CLIENT_IP'] && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) {
$onlineip = $_SERVER['HTTP_CLIENT_IP'];
}
}
if ($onlineip == 'Unknown' && isset($_SERVER['HTTP_CDN_SRC_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CDN_SRC_IP'])) {
$onlineip = $_SERVER['HTTP_CDN_SRC_IP'];
}
if ($onlineip == 'Unknown' && isset($_SERVER['HTTP_NS_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER ['HTTP_NS_IP'])) {
$onlineip = $_SERVER ['HTTP_NS_IP'];
}
if ($onlineip == 'Unknown' && isset($_SERVER['REMOTE_ADDR']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['REMOTE_ADDR'])) {
$onlineip = $_SERVER['REMOTE_ADDR'];
}
return $onlineip;
}
1. 概念梳理
- $_SERVER[‘HTTP_X_REAL_IP’]
- $_SERVER[‘HTTP_X_FORWARDED_FOR’]
- $_SERVER[‘HTTP_CLIENT_IP’]
- $_SERVER[‘HTTP_CDN_SRC_IP’]
- $_SERVER[‘HTTP_NS_IP’]
- $_SERVER[‘REMOTE_ADDR’]
2. 具体作用
$_SERVER['HTTP_X_REAL_IP']
nginx 代理模式下,获取客户端真实IP
$_SERVER['HTTP_CLIENT_IP']
代理端的(有可能存在,可伪造)
$_SERVER['HTTP_X_FORWARDED_FOR']
用户是在哪个IP使用的代理(有可能存在,也可以伪造)
$_SERVER['HTTP_CDN_SRC_IP']
CDN获取真实IP
$_SERVER['REMOTE_ADDR']
浏览当前页面的用户计算机的ip地址