首页 > 解决方案 > 问题是它在某些用户中返回 0.0.0.0,而不是用户的真实 ip

问题描述

我在注册看到一些 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;}

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

标签: php

解决方案


你这样做的方式将返回第一个非空字符串并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 值(如果您希望丢弃这些值)。

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


推荐阅读