function real_ip()
{
static $realip = NULL;
if ($realip !== NULL) {
return $realip;
}
if (isset($_SERVER)) {
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
/* 取X-Forwarded-For中第一个非unknown的有效IP字符串 */
foreach ($arr AS $ip) {
$ip = trim($ip);
if ($ip != 'unknown') {
$realip = $ip;
break;
}
}
} elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
$realip = $_SERVER['HTTP_CLIENT_IP'];
} else {
if (isset($_SERVER['REMOTE_ADDR'])) {
$realip = $_SERVER['REMOTE_ADDR'];
} else {
$realip = '0.0.0.0';
}
}
} else {
if (getenv('HTTP_X_FORWARDED_FOR')) {
$realip = getenv('HTTP_X_FORWARDED_FOR');
} elseif (getenv('HTTP_CLIENT_IP')) {
$realip = getenv('HTTP_CLIENT_IP');
} else {
$realip = getenv('REMOTE_ADDR');
}
}
$onlineip = null;
preg_match("/[\d\.]{7,15}/", $realip, $onlineip);
$realip = !empty($onlineip[0]) ? $onlineip[0] : '0.0.0.0';
return $realip;
}
本文介绍了一个用于获取客户端真实IP地址的PHP函数。该函数通过检查HTTP头部信息,如HTTP_X_FORWARDED_FOR和HTTP_CLIENT_IP,以及$_SERVER变量来确定客户端的实际IP。在没有直接访问到客户端IP的情况下,它会返回默认的'0.0.0.0'。函数首先尝试从X-Forwarded-For头中提取第一个非'unknown'的有效IP地址,如果没有找到,它会使用HTTP_CLIENT_IP或REMOTE_ADDR。如果这些都不存在,它将从环境变量中获取IP。最后,函数确保返回的IP地址格式正确,并且长度在7到15个字符之间。
1848

被折叠的 条评论
为什么被折叠?



