初学PHP,在研究源码的时候,给网站使用了cloudflare,导致无法获取用户真实ip。最后发现在源码中,获取ip的方式是$ip = $_SERVER['REMOTE_ADDR'];
print_r了$_SERVER,这才想起来是超级全局变量。
发现真实IP是存在HTTP_CF_CONNECTING_IP里的,最后搜索了一下解决方案,有现成的就直接拿过来用了。
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){ $ip_list = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']); $_SERVER['REMOTE_ADDR'] = $ip_list[0]; }
但是此时又出现了问题,网站能正确获取用户真实ip,但显示地址的时候还是有问题。
然后回去查看源码,发现使用的是126的接口,估计是数据库更新不及时,ip判断不准确。
//更新用户ip
function jinsom_update_ip($user_id) { $city_lock=get_user_meta($user_id,'city_lock',true); if($city_lock=='unlock'||!$city_lock) { $ip = $_SERVER['REMOTE_ADDR']; $str = file_get_contents('http://ip.ws.126.net/ipquery?ip='.$ip); $str1= explode('localAddress={city:"',$str); $str1=iconv("gb2312","UTF-8",$str1['1']); $str2= explode('", province',$str1); $p1=explode('province:"',$str1); $p2=explode('"',$p1['1']); if($str2['0']==''||$str2['0']==$p2['0']) { $city=$p2['0']; } else { $city=$p2['0'].'·'.$str2['0']; } update_user_meta($user_id,'city',$city); } }
搜索了几个接口,发现了taobao的接口很完美,于是着手替换http://ip.taobao.com/service/getIpInfo.php?ip=
但是此时又出现了新问题,126的接口传回来的数据是个数组直接能用,taobao接口传回来的是json格式的,那只能又去搜,最后发现了json_decode(),在之前的代码上按我的理解修改测试。
最终完美替换成taobao的接口,前台正确显示了地理位置,很棒!
function jinsom_update_ip($user_id) { $city_lock=get_user_meta($user_id,'city_lock',true); if($city_lock=='unlock'||!$city_lock) { $ip = $_SERVER['REMOTE_ADDR']; $url="http://ip.taobao.com/service/getIpInfo.php?ip=".$ip; $ip=json_decode(file_get_contents($url)); if((string)$ip-> code=='1') { return false; } else { $data = (array)$ip-> data; } if($data['country']==''||$data['region']==$data['city']) { $city=$data['city']; } else { $city=$data['region'].'·'.$data['city']; } update_user_meta($user_id,'city',$city); } }
本文作者:𝙕𝙆𝘾𝙊𝙄
文章名称:CDN下获取访客真实IP,并且获取地理位置!
文章链接:https://www.zkcoi.com/365up/program/242.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。