PHP 笔记 | php获取客户端真实ip地址的三种方法 | 判断IP为有效IP地址 | 区分ipv4/ipv6

标签: none

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地址的三种方法

二. 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
}

php如何判断IP为有效IP地址

三. 检查是否有人通过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里面,它到底占用多少个字符?


扫描二维码,在手机上阅读!

添加新评论