这是获取IP地址的更简洁,更简洁的方法:
function get_ip_address(){
foreach (array(\'HTTP_CLIENT_IP\', \'HTTP_X_FORWARDED_FOR\', \'HTTP_X_FORWARDED\', \'HTTP_X_CLUSTER_CLIENT_IP\', \'HTTP_FORWARDED_FOR\', \'HTTP_FORWARDED\', \'REMOTE_ADDR\') as $key){
if (array_key_exists($key, $_SERVER) === true){
foreach (explode(\',\', $_SERVER[$key]) as $ip){
$ip = trim($ip); // just to be safe
if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false){
return $ip;
}
}
}
}
}
我希望它有所帮助!
您的代码似乎已经相当完整,我看不到任何可能的错误(除了通常的IP警告),我会更改validate_ip()函数依赖于过滤器扩展:
public function validate_ip($ip)
{
if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) === false)
{
return false;
}
self::$ip = sprintf(\'%u\', ip2long($ip)); // you seem to want this
return true;
}
您的HTTP_X_FORWARDED_FOR代码段也可以简化:
// check for IPs passing through proxies
if (!empty($_SERVER[\'HTTP_X_FORWARDED_FOR\']))
{
// check if multiple ips exist in var
if (strpos($_SERVER[\'HTTP_X_FORWARDED_FOR\'], \',\') !== false)
{
$iplist = explode(\',\', $_SERVER[\'HTTP_X_FORWARDED_FOR\']);
foreach ($iplist as $ip)
{
if ($this->validate_ip($ip))
return $ip;
}
}
else
{
if ($this->validate_ip($_SERVER[\'HTTP_X_FORWARDED_FOR\']))
return $_SERVER[\'HTTP_X_FORWARDED_FOR\'];
}
}
对此:
// check for IPs passing through proxies
if (!empty($_SERVER[\'HTTP_X_FORWARDED_FOR\']))
{
$iplist = explode(\',\', $_SERVER[\'HTTP_X_FORWARDED_FOR\']);
foreach ($iplist as $ip)
{
if ($this->validate_ip($ip))
return $ip;
}
}
您可能还需要验证IPv6地址。
继续阅读与本文标签相同的文章
下一篇 :
PHP如何将数组转化为对象
-
互联网的下半场,在大小城市里飞驰的电瓶车上
2026-05-15栏目: 教程
-
Robotframework-RED-指定测试报告存放的路径
2026-05-15栏目: 教程
-
株洲首个数据中心站投运
2026-05-15栏目: 教程
-
微软Edge新标签页迎来新布局:新闻区可替换为工作相关内容
2026-05-15栏目: 教程
-
取快递件竟有BUG!这是恶意为之?双十一得好好注意了
2026-05-15栏目: 教程
