最近项目中需要实现一个“根据IP自动跳转地区页面”的功能。查资料发现两种实现方式,一种是下载IP数据包,另一种是调用大公司的API。感觉还是调用API比较好,数据应该是最新的。大公司API有三个:
1、腾讯 http://fw.qq.com/ipaddress
返回值 var IPData = new Array("61.135.152.194","","北京市","");
2、新浪 : http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js 多地域测试方法:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=218.192.3.42
返回值 var remote_ip_info = {"ret":1,"start":"218.192.0.0","end":"218.192.7.255","country":"\中\国","province":"\广\东","city":"\广\州","district":"
3、谷歌 : http://j.maxmind.com/app/geoip.js
此API提供的接口共有6个,geoip_country_code(){国家代 码},geoip_country_ name(){国家名称},geoip_city() {城市名称},geoip_region(){地区代码},geoip_latitude(){经度},geoip_longitude(){纬度}。
这次功能实现用的是新浪API,代码如下:
<?php
header("Content-type: text/html; charset=utf8");
/**
* 获取客户端+服务端IP及地理位置信息 Sina iplookup
*
* @Support:QQ 910111100 (JoY)
* @Time: 2012.10.11 15:50:00
* @HZapi.com (http://www.hzapi.com/)
*
*/
//取得地理位置信息
function iplookup($ip=1){
if($ip){ //客户端
$userip=egetip_joy(); //客户端IP
}else{ //服务端
$domain=$_SERVER['HTTP_HOST'];
$userip=gethostbyname($domain);
}
//返回Sina地理位置信息
$json=@file_get_contents('http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip='.$userip);
$patterns = array();
$patterns[0] = '/var remote_ip_info = /';
$patterns[1] = '/;/';
$patterns[2] = '/\Wu/';
$find = array();
$find[0] = "";
$find[1] = "";
$find[2] = "%u";
$json = preg_replace($patterns, $find, $json); //过滤多余字符
$json_arr=json_decode($json,true);
return $json_arr;
}
//取得IP
function egetip_joy(){
if(getenv('HTTP_CLIENT_IP')&&strcasecmp(getenv('HTTP_CLIENT_IP'),'unknown'))
{
$ip=getenv('HTTP_CLIENT_IP');
}
elseif(getenv('HTTP_X_FORWARDED_FOR')&&strcasecmp(getenv('HTTP_X_FORWARDED_FOR'),'unknown'))
{
$ip=getenv('HTTP_X_FORWARDED_FOR');
}
elseif(getenv('REMOTE_ADDR')&&strcasecmp(getenv('REMOTE_ADDR'),'unknown'))
{
$ip=getenv('REMOTE_ADDR');
}
elseif(isset($_SERVER['REMOTE_ADDR'])&&$_SERVER['REMOTE_ADDR']&&strcasecmp($_SERVER['REMOTE_ADDR'],'unknown'))
{
$ip=$_SERVER['REMOTE_ADDR'];
}
$ip=preg_replace("/^([d.]+).*/","1",$ip);
return $ip;
}
/**
* 模拟JS里的unescape
*
* @Support:QQ 910111100 (JoY)
* @Time: 2012.09.29 15:50:00
* @HZapi.com (http://www.hzapi.com/)
* echo unescape('%u4e1c%u6e56%u82b1%u56ed4%u53f7%u5c0f%u533a');
*/
function unescape($str) {
$str = rawurldecode($str);
preg_match_all("/(?:%u.{4})|.{4};|&#\d+;|.+/U",$str,$r);
$ar = $r[0];
foreach($ar as $k=>$v) {
if(substr($v,0,2) == "%u")
{
$ar[$k] = iconv("UCS-2","utf-8//IGNORE",pack("H4",substr($v,-4)));
}
elseif(substr($v,0,3) == "")
{
$ar[$k] = iconv("UCS-2","utf-8",pack("H4",substr($v,3,-1)));
}
elseif(substr($v,0,2) == "&#")
{
echo substr($v,2,-1)."";
$ar[$k] = iconv("UCS-2","utf-8",pack("n",substr($v,2,-1)));
}
}
return join("",$ar);
}
?>
<?php
$iplookup=iplookup(); //iplookup(1)参数非空为获取服务器端IP
$ClientCountry=unescape($iplookup['country']); //获得所在国家字符串
if ($ClientCountry == "中国"){
Header("Location: http://url1"); //将此处的URL修改为对应国家的页面,以下各项类同
}
elseif ($ClientCountry == "台湾"){
Header("Location: http://url2");
}
else{
Header("Location: http://url3");
}
?>
以上代码保存为独立PHP文件即可用于跳转。主要代码由JoY提供,感谢分享!
另,接口信息参考(http://blog.163.com/wzi_xiang/blog/static/6598296120118284720317/)