
初学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);
}
}
本文作者:ZKCOI
文章名称:CDN下获取访客真实IP,并且获取地理位置!
文章链接:https://www.zkcoi.com/365up/program/242.html
本站资源仅供个人学习和交流,如若转载,请注明出处,详见《免责声明》。
微信扫一扫
支付宝扫一扫
