支付宝搜索“521047472”
领个红包吧!

CDN下获取访客真实IP,并且获取地理位置!

初学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);
	}
}
赞(0) 打赏
支付宝搜索“521047472” 领个红包吧!:思想创意收集馆 » CDN下获取访客真实IP,并且获取地理位置!
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

zk的思想创意收集馆

市场入门运营入门

支付宝搜索“521047472” 领个红包吧!

支付宝扫一扫打赏

微信扫一扫打赏