php获取客户端真实ip地址的三种方法 | 判断IP为有效IP地址 | 区分ipv4/ipv6 共计3个内容
Ipv4和Ipv6的地址字符串长度
一. php获取客户端真实ip地址的三种方法
php获取用户(客户端)真实IP地址的三种方法
第一种方法,还算靠谱.
function get_real_ip(){ $ip=false; if(!empty($_SERVER['HTTP_CLIENT_IP'])){ $ip=$_SERVER['HTTP_CLIENT_IP']; } if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){ $ips=explode (', ', $_SERVER['HTTP_X_FORWARDED_FOR']); if($ip){ array_unshift($ips, $ip); $ip=FALSE; } for ($i=0; $i < count($ips); $i++){ if(!preg_match ('/^(10│172.16│192.168)./', $ips[$i])){ $ip=$ips[$i]; break; } } } return ($ip ? $ip : $_SERVER['REMOTE_ADDR']); }
第二种方法:
function get_real_ip(){ static $realip; if(isset($_SERVER)){ if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){ $realip=$_SERVER['HTTP_X_FORWARDED_FOR']; }else if(isset($_SERVER['HTTP_CLIENT_IP'])){ $realip=$_SERVER['HTTP_CLIENT_IP']; }else{ $realip=$_SERVER['REMOTE_ADDR']; } }else{ if(getenv('HTTP_X_FORWARDED_FOR')){ $realip=getenv('HTTP_X_FORWARDED_FOR'); }else if(getenv('HTTP_CLIENT_IP')){ $realip=getenv('HTTP_CLIENT_IP'); }else{ $realip=getenv('REMOTE_ADDR'); } } return $realip; }
第三种方法,摘自DISCUZ,应该还不错吧!
// 获取IP地址(摘自discuz) function getIp(){ $ip='未知IP'; if(!empty($_SERVER['HTTP_CLIENT_IP'])){ return is_ip($_SERVER['HTTP_CLIENT_IP'])?$_SERVER['HTTP_CLIENT_IP']:$ip; }elseif(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){ return is_ip($_SERVER['HTTP_X_FORWARDED_FOR'])?$_SERVER['HTTP_X_FORWARDED_FOR']:$ip; }else{ return is_ip($_SERVER['REMOTE_ADDR'])?$_SERVER['REMOTE_ADDR']:$ip; } } function is_ip($str){ $ip=explode('.',$str); for($i=0;$i255){ return false; } } return preg_match('/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/',$str); }
我目前在使用的
function getRealIp() { static $realip; if(isset($_SERVER)){ if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){ $realip=$_SERVER['HTTP_X_FORWARDED_FOR']; }else if(isset($_SERVER['HTTP_CLIENT_IP'])){ $realip=$_SERVER['HTTP_CLIENT_IP']; }else{ $realip=$_SERVER['REMOTE_ADDR']; } }else{ if(getenv('HTTP_X_FORWARDED_FOR')){ $realip=getenv('HTTP_X_FORWARDED_FOR'); }else if(getenv('HTTP_CLIENT_IP')){ $realip=getenv('HTTP_CLIENT_IP'); }else{ $realip=getenv('REMOTE_ADDR'); } } if(filter_var($realip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE)) { return $realip; }elseif(filter_var($realip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) { return $realip; }else { return -1; } }
二. php如何判断IP为有效IP地址
多数人看到这篇日志,第一印象肯定是以为是要讲如何通过正则表达式来判断。
非也,在php5.2.0之后,有专门的函数来做这个判断了。
判断是否是合法IP
if(filter_var($ip, FILTER_VALIDATE_IP)) { // it's valid } else { // it's not valid }
判断是否是合法的IPv4 IP地址
if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { // it's valid } else { // it's not valid }
判断是否是合法的公共IPv4地址,192.168.1.1这类的私有IP地址将会排除在外
if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_NO_PRIV_RANGE)) { // it's valid } else { // it's not valid }
判断是否是合法的IPv6地址
if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)) { // it's valid } else { // it's not valid }
判断是否是public IPv4 IP或者是合法的Public IPv6 IP地址
if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) { // it's valid } else { // it's not valid }
三. 检查是否有人通过IPv6/IPv4连接
我想通过PHP检查,如果有人通过IPv4或IPv6连接到我的网站。
客户端地址可以在$_SERVER ["REMOTE_ADDR"]
中找到,但如何检查它是IPv4还是IPv6?
function ipVersion($txt) { return strpos($txt, ":") === false ? 4 : 6; }
php – 如何检查是否有人通过IPv6/IPv4连接
How to know which version of the Internet Protocol (IP) a client is using when connecting to my server?
四. Ipv4和Ipv6的地址字符串长度
IPv4采用32位地址长度 xxx.xxx.xxx.xxx 15max(string) IPv6采用128位地址长度 FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF 63max(string)
Ipv4和Ipv6的地址字符串长度
一个完整的IPv6显示在TextBox里面,它到底占用多少个字符?