您现在的位置:首页 >> 建站经验 >> 内容

应广大MJJ要求,特发关于 根据IP跳转不同城市代码

时间:2009/12/25 1:17:43 点击:2492

  核心提示:?//php获取ip的算法$user_IP = ($_SERVER['HTTP_VIA']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];$user_IP = ($user_IP) ? $user_IP : $_SERVE...

  1. <?
  2. //php获取ip的算法
  3. $user_IP = ($_SERVER["HTTP_VIA"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"];
  4. $user_IP = ($user_IP) ? $user_IP : $_SERVER["REMOTE_ADDR"];

  5. //echo $user_IP;
  6. ?>
  7. <?
  8. //===================================
  9. //
  10. // 功能:IP地址获取真实地址函数
  11. // 参数:$ip - IP地址
  12. // 作者:[Discuz!] (C) Comsenz Inc.
  13. //
  14. //===================================
  15. function convertip($ip) {
  16.     //IP数据文件路径
  17.     $dat_path = 'QQWry.dat';

  18.     //检查IP地址
  19.     if(!ereg("^([0-9]{1,3}.){3}[0-9]{1,3}$", $ip)){
  20.         return 'IP Address Error';
  21.     }

  22.     //打开IP数据文件
  23.     if(!$fd = @fopen($dat_path, 'rb')){
  24.         return 'IP date file not exists or access denied';
  25.     }

  26.     //分解IP进行运算,得出整形数
  27.     $ip = explode('.', $ip);
  28.     $ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];

  29.     //获取IP数据索引开始和结束位置
  30.     $DataBegin = fread($fd, 4);
  31.     $DataEnd = fread($fd, 4);
  32.     $ipbegin = implode('', unpack('L', $DataBegin));
  33.     if($ipbegin < 0) $ipbegin += pow(2, 32);
  34.     $ipend = implode('', unpack('L', $DataEnd));
  35.     if($ipend < 0) $ipend += pow(2, 32);
  36.     $ipAllNum = ($ipend - $ipbegin) / 7 + 1;

  37.     $BeginNum = 0;
  38.     $EndNum = $ipAllNum;

  39.     //使用二分查找法从索引记录中搜索匹配的IP记录
  40.     while($ip1num>$ipNum || $ip2num<$ipNum) {
  41.         $Middle= intval(($EndNum + $BeginNum) / 2);

  42.         //偏移指针到索引位置读取4个字节
  43.         fseek($fd, $ipbegin + 7 * $Middle);
  44.         $ipData1 = fread($fd, 4);
  45.         if(strlen($ipData1) < 4) {
  46.             fclose($fd);
  47.             return 'System Error';
  48.         }
  49.         //提取出来的数据转换成长整形,如果数据是负数则加上2的32次幂
  50.         $ip1num = implode('', unpack('L', $ipData1));
  51.         if($ip1num < 0) $ip1num += pow(2, 32);

  52.         //提取的长整型数大于我们IP地址则修改结束位置进行下一次循环
  53.         if($ip1num > $ipNum) {
  54.             $EndNum = $Middle;
  55.             continue;
  56.         }

  57.         //取完上一个索引后取下一个索引
  58.         $DataSeek = fread($fd, 3);
  59.         if(strlen($DataSeek) < 3) {
  60.             fclose($fd);
  61.             return 'System Error';
  62.         }
  63.         $DataSeek = implode('', unpack('L', $DataSeek.chr(0)));
  64.         fseek($fd, $DataSeek);
  65.         $ipData2 = fread($fd, 4);
  66.         if(strlen($ipData2) < 4) {
  67.             fclose($fd);
  68.             return 'System Error';
  69.         }
  70.         $ip2num = implode('', unpack('L', $ipData2));
  71.         if($ip2num < 0) $ip2num += pow(2, 32);

  72.         //没找到提示未知
  73.         if($ip2num < $ipNum) {
  74.             if($Middle == $BeginNum) {
  75.                 fclose($fd);
  76.                 return 'Unknown';
  77.             }
  78.             $BeginNum = $Middle;
  79.         }
  80.     }

  81.     //下面的代码读晕了,没读明白,有兴趣的慢慢读
  82.     $ipFlag = fread($fd, 1);
  83.     if($ipFlag == chr(1)) {
  84.         $ipSeek = fread($fd, 3);
  85.         if(strlen($ipSeek) < 3) {
  86.             fclose($fd);
  87.             return 'System Error';
  88.         }
  89.         $ipSeek = implode('', unpack('L', $ipSeek.chr(0)));
  90.         fseek($fd, $ipSeek);
  91.         $ipFlag = fread($fd, 1);
  92.     }

  93.     if($ipFlag == chr(2)) {
  94.         $AddrSeek = fread($fd, 3);
  95.         if(strlen($AddrSeek) < 3) {
  96.             fclose($fd);
  97.             return 'System Error';
  98.         }
  99.         $ipFlag = fread($fd, 1);
  100.         if($ipFlag == chr(2)) {
  101.             $AddrSeek2 = fread($fd, 3);
  102.             if(strlen($AddrSeek2) < 3) {
  103.                 fclose($fd);
  104.                 return 'System Error';
  105.             }
  106.             $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
  107.             fseek($fd, $AddrSeek2);
  108.         } else {
  109.             fseek($fd, -1, SEEK_CUR);
  110.         }

  111.         while(($char = fread($fd, 1)) != chr(0))
  112.             $ipAddr2 .= $char;

  113.         $AddrSeek = implode('', unpack('L', $AddrSeek.chr(0)));
  114.         fseek($fd, $AddrSeek);

  115.         while(($char = fread($fd, 1)) != chr(0))
  116.             $ipAddr1 .= $char;
  117.     } else {
  118.         fseek($fd, -1, SEEK_CUR);
  119.         while(($char = fread($fd, 1)) != chr(0))
  120.             $ipAddr1 .= $char;

  121.         $ipFlag = fread($fd, 1);
  122.         if($ipFlag == chr(2)) {
  123.             $AddrSeek2 = fread($fd, 3);
  124.             if(strlen($AddrSeek2) < 3) {
  125.                 fclose($fd);
  126.                 return 'System Error';
  127.             }
  128.             $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
  129.             fseek($fd, $AddrSeek2);
  130.         } else {
  131.             fseek($fd, -1, SEEK_CUR);
  132.         }
  133.         while(($char = fread($fd, 1)) != chr(0)){
  134.             $ipAddr2 .= $char;
  135.         }
  136.     }
  137.     fclose($fd);

  138.     //最后做相应的替换***作后返回结果
  139.     if(preg_match('/http/i', $ipAddr2)) {
  140.         $ipAddr2 = '';
  141.     }
  142.     $ipaddr = "$ipAddr1 $ipAddr2";
  143.     $ipaddr = preg_replace('/CZ88.Net/is', '', $ipaddr);
  144.     $ipaddr = preg_replace('/^s*/is', '', $ipaddr);
  145.     $ipaddr = preg_replace('/s*$/is', '', $ipaddr);
  146.     if(preg_match('/http/i', $ipaddr) || $ipaddr == '') {
  147.         $ipaddr = 'Unknown';
  148.     }

  149.     return $ipaddr;
  150. }
  151. ?>

  152.         var sf='<?echo convertip($user_IP);?>';

  153. if(sf.indexOf("香港")>=0){
  154.         window.location.href="http://www.k6china.com/?香港";
  155. }
  156. else if(sf.indexOf("广东省")>=0){
  157.         window.location.href="http://www.k6china.com/?广东";
  158. }

  159. //注释A
复制代码
用法:
1.下载纯真IP数据库 (百度一下相当多的)
我们只用里面的 QQWry.Dat
2.把我发的代码存为ip.php
3.把1跟2的文件均放在同一个文件夹里,比如你放在文件夹 /ipcity/

4.在需要的页面插入<script src="/ipcity/ip.php"></script> ,

5.如果你需要跳转更多的城市,那么只需要在注释A上面 添加以下代码
  1. else if(sf.indexOf("省份或者城市")>=0){
  2.         window.location.href="http://www.k6china.com/?跳转到的省份或城市";
  3. }
复制代码
如果看了我上面的说明,你仍然不会用,那么哥可以肯定的告诉你,你不懂一点代码知识,或者说,非常笨,虽然我不想说的这么直接


补充:这是哥自己网上搜索的PHP代码,并自己写了JS搞的,这个PHP是来自discuz的代码,效率就不多说了
数据库纯真的,想必大家也清楚,那么哥唯一写的JS 又不占服务器资源,抛砖引玉吧

作者:冷月湖 录入:冷月湖 来源:原创
相关评论
发表我的评论
  • 大名:
  • 内容:
  • 亿万站网址导航-站长之家(www.yiwanzhan.cn) © 2006-2024 版权所有 All Rights Reserved.
  • Email:xiegr71@163.com 站长QQ:329700870 京ICP备07500142号