1949啦网--小小 痛苦,是因为能力和欲望不匹配造成的

jquery来实现ajax读取不同IP归属地或(不同国家)信息并判断跳转不同网站

今天接到一个开发需求,根本访客不同IP归属地(国别)来跳转不同网站,案例类似:中国用户跳转A站,非中国用户跳转B站

首先后端我们选择PHP,IP数据库选择纯真IP数据库(目前民间数据中最准确的了)

先看看PHP后端实现方法:

<?php  header('Access-Control-Allow-Origin:*');  $ipzhenshi = get_real_ip();  function get_real_ip(){  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'];}  return preg_match("/[\d\.]{7,15}/", $ip, $matches) ? $matches[0] : false;  }  class IpLocation {      /**       * QQWry.Dat文件指针       *       * @var resource       */      private $fp;      /**       * 第一条IP记录的偏移地址       *       * @var int       */      private $firstip;      /**       * 最后一条IP记录的偏移地址       *       * @var int       */      private $lastip;      /**       * IP记录的总条数(不包含版本信息记录)       *       * @var int       */      private $totalip;      /**       * 构造函数,打开 QQWry.Dat 文件并初始化类中的信息       *       * @param string $filename       * @return IpLocation       */      public function __construct($filename = "qqwry.dat") {          $this->fp = 0;          if (($this->fp      = fopen(dirname(__FILE__).'/'.$filename, 'rb')) !== false) {              $this->firstip  = $this->getlong();              $this->lastip   = $this->getlong();              $this->totalip  = ($this->lastip - $this->firstip) / 7;          }      }      /**       * 返回读取的长整型数       *       * @access private       * @return int       */      private function getlong() {          //将读取的little-endian编码的4个字节转化为长整型数          $result = unpack('Vlong', fread($this->fp, 4));          return $result['long'];      }      /**       * 返回读取的3个字节的长整型数       *       * @access private       * @return int       */      private function getlong3() {          //将读取的little-endian编码的3个字节转化为长整型数          $result = unpack('Vlong', fread($this->fp, 3).chr(0));          return $result['long'];      }      /**       * 返回压缩后可进行比较的IP地址       *       * @access private       * @param string $ip       * @return string       */      private function packip($ip) {          // 将IP地址转化为长整型数,如果在PHP5中,IP地址错误,则返回False,          // 这时intval将Flase转化为整数-1,之后压缩成big-endian编码的字符串          return pack('N', intval(ip2long($ip)));      }      /**       * 返回读取的字符串       *       * @access private       * @param string $data       * @return string       */      private function getstring($data = "") {          $char = fread($this->fp, 1);          while (ord($char) > 0) {        // 字符串按照C格式保存,以\0结束              $data  .= $char;             // 将读取的字符连接到给定字符串之后              $char   = fread($this->fp, 1);          }          return $data;      }      /**       * 返回地区信息       *       * @access private       * @return string       */      private function getarea() {          $byte = fread($this->fp, 1);    // 标志字节          switch (ord($byte)) {              case 0:                     // 没有区域信息                  $area = "";                  break;              case 1:              case 2:                     // 标志字节为1或2,表示区域信息被重定向                  fseek($this->fp, $this->getlong3());                  $area = $this->getstring();                  break;              default:                    // 否则,表示区域信息没有被重定向                  $area = $this->getstring($byte);                  break;          }          return $area;      }      private $provinces = array("黑龙江省","辽宁省","吉林省","河北省","河南省","湖北省","湖南省","山东省","山西省","陕西省",                                    "安徽省","浙江省","江苏省","福建省","广东省","海南省","四川省","云南省","贵州省","青海省","甘肃省",                                    "江西省","台湾省","内蒙古","宁夏","新疆","西藏","广西","北京市","上海市","天津市","重庆市","香港","澳门");      /**       * 根据所给 IP 地址或域名返回所在地区信息       *       * @access public       * @param string $ip       * @return array       */      public function getlocation($ip='') {          if (!$this->fp) return null;            // 如果数据文件没有被正确打开,则直接返回空  if(empty($ip)) $ip = get_client_ip();          $location['ip'] = gethostbyname($ip);   // 将输入的域名转化为IP地址          $ip = $this->packip($location['ip']);   // 将输入的IP地址转化为可比较的IP地址                                                  // 不合法的IP地址会被转化为255.255.255.255          // 对分搜索          $l = 0;                         // 搜索的下边界          $u = $this->totalip;            // 搜索的上边界          $findip = $this->lastip;        // 如果没有找到就返回最后一条IP记录(QQWry.Dat的版本信息)          while ($l <= $u) {              // 当上边界小于下边界时,查找失败              $i = floor(($l + $u) / 2);  // 计算近似中间记录              fseek($this->fp, $this->firstip + $i * 7);              $beginip = strrev(fread($this->fp, 4));     // 获取中间记录的开始IP地址              // strrev函数在这里的作用是将little-endian的压缩IP地址转化为big-endian的格式              // 以便用于比较,后面相同。              if ($ip < $beginip) {       // 用户的IP小于中间记录的开始IP地址时                  $u = $i - 1;            // 将搜索的上边界修改为中间记录减一              }              else {                  fseek($this->fp, $this->getlong3());                  $endip = strrev(fread($this->fp, 4));   // 获取中间记录的结束IP地址                  if ($ip > $endip) {     // 用户的IP大于中间记录的结束IP地址时                      $l = $i + 1;        // 将搜索的下边界修改为中间记录加一                  }                  else {                  // 用户的IP在中间记录的IP范围内时                      $findip = $this->firstip + $i * 7;                      break;              // 则表示找到结果,退出循环                  }              }          }          //获取查找到的IP地理位置信息          fseek($this->fp, $findip);          $location['beginip'] = long2ip($this->getlong());   // 用户IP所在范围的开始地址          $offset = $this->getlong3();          fseek($this->fp, $offset);          $location['endip'] = long2ip($this->getlong());     // 用户IP所在范围的结束地址          $byte = fread($this->fp, 1);    // 标志字节          switch (ord($byte)) {              case 1:                     // 标志字节为1,表示国家和区域信息都被同时重定向                  $countryOffset = $this->getlong3();         // 重定向地址                  fseek($this->fp, $countryOffset);                  $byte = fread($this->fp, 1);    // 标志字节                  switch (ord($byte)) {                      case 2:             // 标志字节为2,表示国家信息又被重定向                          fseek($this->fp, $this->getlong3());                          $location['country']    = $this->getstring();                          fseek($this->fp, $countryOffset + 4);                          $location['area']       = $this->getarea();                          break;                      default:            // 否则,表示国家信息没有被重定向                          $location['country']    = $this->getstring($byte);                          $location['area']       = $this->getarea();                          break;                  }                  break;              case 2:                     // 标志字节为2,表示国家信息被重定向                  fseek($this->fp, $this->getlong3());                  $location['country']    = $this->getstring();                  fseek($this->fp, $offset + 8);                  $location['area']       = $this->getarea();                  break;              default:                    // 否则,表示国家信息没有被重定向                  $location['country']    = $this->getstring($byte);                  $location['area']       = $this->getarea();                  break;          }          if (trim($location['country']) == 'CZ88.NET') {  // CZ88.NET表示没有有效信息              $location['country'] = '未知';          }          if (trim($location['area']) == 'CZ88.NET') {              $location['area'] = '';          }          $location['country'] = @iconv('gbk','utf-8',$location['country']); //转换格式,防止乱码          $location['area'] = @iconv('gbk','utf-8',$location['area']); //转换格式,防止乱码          foreach($this->provinces as $v) {              if(strpos($location['country'],$v) === 0) {                  $location['province'] = $v;                  $location['city'] = str_replace($v,'',$location['country']);                  break;              }          }  if(strpos($location['area'],'美国') > -1)  {   $location['country'] = '美国';  }  if(strpos($location['province'],'省') == true)  {   $location['country'] = '中国';  }  if(strpos($location['province'],'市') == true)  {   $location['country'] = '中国';  }  /*  if(strpos($location['country'],'国') == false)  {   if(empty($location['province'])) $location['province'] = $location['country']; $location['country'] = '';  }  */          if(empty($location['city'])) $location['city'] = '';          return $location;      }      /**       * 析构函数,用于在页面执行结束后自动关闭打开的文件。       *       */      public function __destruct() {          if ($this->fp) {              fclose($this->fp);          }          $this->fp = 0;      }  }  $new = new IpLocation();  $ip = $new->getlocation($ipzhenshi);   $php_json = json_encode($ip); //把php数组格式转换成 json 格式的数据  echo $php_json;  ?>

将该PHP命名为ip.php,然后在同目录下放上从纯真下载的qqwry.dat数据库文件

然后前端我们选择使用jquery来实现ajax读取IP归属地信息并判断跳转

代码(index.html):

<!DOCTYPE html>  <html>  	<head>  		<meta charset="UTF-8">  		<title></title>  <script src="../js/jquery-1.11.3.min.js"></script>  <style type="text/css">  #divframe {    border: 1px solid #999;    width: 500px;    margin: 0 auto;  }  .loadTitle {    background: #CCC;    height: 30px;  }  </style>  <script type="text/javascript">  $(function(){          $.getJSON("ip.php",function(data){        var $jsontip = $("#jsonTip");        $jsontip.empty();//清空内容                  strHtml = "您的IP:"+data.ip + ",来自:" +data.country + "<br>";         if( data.country =="中国")         {          strHtml += "<br>来自中国跳转:1";            location.href = "http://www.baidu.com";         }        else{        strHtml += "<br>来自国外跳转:2";          location.href = "http://www.google.com";        }                $jsontip.html(strHtml);//显示处理后的数据         })  })  </script>  </head>  <body>  <div id="divframe">    <div id="jsonTip"> </div>  </div>  </body>  </html>

原文链接:https://www.qiquanji.com/post/7839.html

本站声明:网站内容来源于网络,如有侵权,请联系我们,我们将及时处理。

微信扫码关注

更新实时通知

作者:xialibing 分类:网页教程 浏览: