前几天写一个项目,需要用到获取微信客户端的IP,因为我用的是ThtinkPHP5,ThtinkPHP5有个内置函数直接调用就行:

<?php
    use think\Request;
    $uip = Request::instance()->ip();
    dump($uip);

但是得出的结果到让我出乎意料,获取到的竟然不是我想要的准确IP是个代理IP,这尼玛抠脚了,有时候甚至获取到两个IP。
这时候我猜测是不是通过QQ微信访问的时候他会进行IP代理,于是就找了一个网上的通用方法(PS:我懒,所以不自己写,而且造重复的轮子也没必要!)。下面贴代码

//不同环境下获取真实的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,大概看了一下网上的方法基本同出一辙,都没有解决我的问题。没办法只好自己动手了,下面贴下代码。

/**
 * 获取客户端IP
 * @return [type] 返回IP地址信息
 */
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 (strpos($realip, ',') === false) {
        $sUserIp = $realip;
    } else {
        $arrUserIp = explode(',', $realip);
        $sUserIp = $arrUserIp[0];
    }
    return $sUserIp;
}

这下子完美解决问题 获取真实IP成功!

原创文章 未经许可 禁止搬运!

最后修改:2023 年 07 月 25 日
您的赞赏是对我最大的支持。