如何解决PHP在360浏览器和火狐浏览器获取到IP地址值不同的问题?

在做微信扫码支付模式二开发,使用如下方式获取到的IP地址在不同浏览器里结果不一样,这也就导致了火狐浏览器可以出结果而360浏览器不行。
获取IP地址代码(这是微信支付开发里边的代码): $_SERVER['REMOTE_ADDR']

火狐浏览器结果:IP地址 :127.0.0.1
360急速/安全浏览器/谷歌浏览器: IP地址 :::1

请问这个问题是微信支付示例代码里边的错误,还是我自身电脑配置的错误呢?

阅读 4.6k
4 个回答

这个是因为win10默认解析成IPV6地址,实际放在线上没问题。我把$_SERVER['REMOTE_ADDR] 转换了一下,替换成127.0.0.1.另外就是使用127.0.0.1访问的话,是没问题的

进行一次判断不就解决了兼容的问题

if($ip=='::1'){
    $ip='127.0.0.1';
}

两个实际是一样的,只不过127.0.0.1是ipv4的回环地址,::1是ipv6的。我觉得你可以试试在网卡属性里把ipv6协议关掉,不过不保证一定有用(回环不走网卡)

因此,使用PHP获取客户端IP的代码可以如下:

function getip() {    
    $unknown = 'unknown';    
    if ( isset($_SERVER['HTTP_X_FORWARDED_FOR'])   
           && $_SERVER['HTTP_X_FORWARDED_FOR']   
           && strcasecmp($_SERVER['HTTP_X_FORWARDED_FOR'], $unknown)   
       ) {    
           $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];    
       } elseif ( isset($_SERVER['REMOTE_ADDR'])   
           && $_SERVER['REMOTE_ADDR'] &&   
           strcasecmp($_SERVER['REMOTE_ADDR'], $unknown) )   
       {    
           $ip = $_SERVER['REMOTE_ADDR'];    
       }    
       /**   
        * 处理多层代理的情况   
        * 或者使用正则方式:$ip = preg_match("/[\d\.] 
        * {7,15}/", $ip, $matches) ? $matches[0] : $unknown;   
        */    
       if (false !== strpos($ip, ','))    
           $ip = reset(explode(',', $ip));    
       return $ip;    
   }  
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题