PHP获取用户IP地址的最准确方法
|
这是获取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_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地址。 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
