问题是它在某些用户中返回 0.0.0.0,而不是用户的真实 IP

  • 本文关键字:用户 IP 真实 返回 问题是 php
  • 更新时间 :
  • 英文 :


我在注册看到wordpress视频的用户的ip时遇到问题这是我获取ip的函数,问题是它在一些用户中返回0.0.0.0,而不是用户的真实ip

function get_ip_address()
{
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
if ($ip === '::1') {
return '127.0.0.1';
}
return $ip;}

这更多的是在服务器或代码方面,有人能帮我吗?

执行此操作的方式将返回第一个非空字符串和0.0.0.0计数。如果愿意的话,你可以尝试添加另一条规则:

function get_ip_address()
{
if (!empty($_SERVER['HTTP_CLIENT_IP']) && $_SERVER['HTTP_CLIENT_IP']!=="0.0.0.0") {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR']!=="0.0.0.0") {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
if ($ip === '::1') {
return '127.0.0.1';
}
return $ip;}

我的方法是,将所有可能的变量存储在一个数组中,并对数组中看起来有效的变量进行评级。像这样的东西会过滤空值并保留剩余值:

$IPS=array_filter([
'addr'=>$_SERVER['REMOTE_ADDR'],
'forx'=>$_SERVER['HTTP_X_FORWARDED_FOR'],
'http'=>$_SERVER['HTTP_CLIENT_IP'],
]);

您也可以将str_replace作为array_map的回调,以删除数组中的0.0.0.0值(如果您希望放弃这些值(。

此外,在过滤坏条目后,如果只能使用1个ip,则可以在数组上使用reset()来获得剩余项中的第一个值。也就是说,如果您按照自己喜欢的顺序设置数组。

function get_client_ip() {
$ipaddress = '';
if (isset($_SERVER['HTTP_CLIENT_IP']))
$ipaddress = $_SERVER['HTTP_CLIENT_IP'];
else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
$ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
else if(isset($_SERVER['HTTP_X_FORWARDED']))
$ipaddress = $_SERVER['HTTP_X_FORWARDED'];
else if(isset($_SERVER['HTTP_FORWARDED_FOR']))
$ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
else if(isset($_SERVER['HTTP_FORWARDED']))
$ipaddress = $_SERVER['HTTP_FORWARDED'];
else if(isset($_SERVER['REMOTE_ADDR']))
$ipaddress = $_SERVER['REMOTE_ADDR'];
else
$ipaddress = 'UNKNOWN';
return $ipaddress;
}
echo get_client_ip();

最新更新