PHP获取客户端真实IP的方法

摘要:
利用getenv获取获取用户真实ip可以获取相当可观的用户数据,不管是做大数据还是数据备份查找来源,都是不错的选择.

好处:
一个网站,获取用户是非常有必要的,你获得了ip可以干嘛?简单了说,它只是显示一个地方,但如果这个ip数据足够大了.对一个网站来说好处可就大大的有了,做大数据,准确营销,假如你是购物网站,你肯定想让商品卖给需要它的人,而不是像超市一样哪里人多往哪开.也不会跑到寺庙卖梳子(把梳子卖给和尚属于骗人).

用法:
此方法不仅仅可以获取来访者IP,就算是国外的IP一样可以获取.甚至挂了vpn的客户端一样能获取到.

这里我们用超全局变量$_SERVER[‘REMOTE_ADDR’],它是你的客户端跟你的服务器”握手”时候的IP。如果使用了”匿名代理”,REMOTE_ADDR将显示代理服务器的IP。

当然,web服务器下,也有不用REMOTE_ADDR的,比如IIS服务器,用的是CLIENT_IP代表客户的IP,如果某人使用了代理,如何获取?HTTP_X_FORWARDED这个可以做到.当然,用这个东西会有一定的安全问题,我们下一篇文章再讨论.

web服务器很多都不允许获取它的服务器信息的,我们就可以用getenv去获取.
代码如下:

//不同环境下获取真实的IP
function get_ip(){
    //判断服务器是否允许$_SERVER
    if(isset($_SERVER)){    
        if(isset($_SERVER[HTTP_X_FORWARDED_FOR])){
            $realip = $_SERVER[HTTP_X_FORWARDED_FOR];
        }elseif(isset($_SERVER[HTTP_CLIENT_IP])) {
            $realip = $_SERVER[HTTP_CLIENT_IP];
        }else{
            $realip = $_SERVER[REMOTE_ADDR];
        }
    }else{
        //不允许就使用getenv获取  
        if(getenv("HTTP_X_FORWARDED_FOR")){
              $realip = getenv( "HTTP_X_FORWARDED_FOR");
        }elseif(getenv("HTTP_CLIENT_IP")) {
              $realip = getenv("HTTP_CLIENT_IP");
        }else{
              $realip = getenv("REMOTE_ADDR");
        }
    }

    return $realip;
}    

为了防止重复运行代码或者重复的来访者IP,我们可以放在静态变量中.只需要在代码前面加如下面代码:

static $realip = NULL;
if($realip !== NULL){
    return $realip;
}

最终:

//不同环境下获取真实的IP
    function get_ip(){
        static $real_ip = NULL;
        if($real_ip !== NULL){
            return $real_ip;
        }
        //判断服务器是否允许$_SERVER
        if(isset($_SERVER)){
            if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
                $real_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
            }elseif(isset($_SERVER['HTTP_CLIENT_IP'])) {
                $real_ip = $_SERVER['HTTP_CLIENT_IP'];
            }else{
                $real_ip = $_SERVER['REMOTE_ADDR'];
            }
        }else{
            //不允许就使用getenv获取
            if(getenv("HTTP_X_FORWARDED_FOR")){
                $real_ip = getenv( "HTTP_X_FORWARDED_FOR");
            }elseif(getenv("HTTP_CLIENT_IP")) {
                $real_ip = getenv("HTTP_CLIENT_IP");
            }else{
                $real_ip = getenv("REMOTE_ADDR");
            }
        }
        return $real_ip;
    }
点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注

6 + 18 =