+ -
当前位置:首页 → 问答吧 → php如何实现不同的ip打开同一网站时,根据IP判断所要跳转的网站?

php如何实现不同的ip打开同一网站时,根据IP判断所要跳转的网站?

时间:2010-09-04

来源:互联网

php如何实现不同的ip打开同一网站时,根据IP判断所要跳转的网站?
{比如,A:IP是中国北京,B:IP是中国上海。   现在同时打开网站www、abc、com,则 A 直接跳转到www、a、com, B 跳转到www、b、com}
请问,这个要怎么实现,最好是能将代码和中文解释写出来。
哪位php高手,能帮帮我!!!
在这里谢谢了!

作者: andygreen4522   发布时间: 2010-09-04

我也想知道

作者: theyejin   发布时间: 2010-09-04

其实也不难,重要的是你要有一个IP库,这里我推荐下QQ纯真IP库
首先获取用户的IP地址,怎么获取楼主应该知道吧?假设这里获取的IP地址为$ip
那么就可以根据$ip查询QQ纯真IP库并返回地点信息
这里给楼主一个函数,是我在网上找到的。感觉还可以
复制代码
  1. function convertip ($ip, $ipFile = '')
  2.     {
  3.         $ipFile = empty($ipFile) ? 'QQWry.dat' : $ipFile;
  4.         if (! preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/", $ip)) {
  5.             return '';
  6.         }
  7.         if ($fd = @fopen($ipFile, 'rb')) { //fopen()中是纯真ip数据库文件位置,请自行设定!
  8.             $ip = explode('.', $ip);
  9.             $ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];
  10.             $DataBegin = fread($fd, 4);
  11.             $DataEnd = fread($fd, 4);
  12.             $ipbegin = implode('', unpack('L', $DataBegin));
  13.             if ($ipbegin < 0)
  14.                 $ipbegin += pow(2, 32);
  15.             $ipend = implode('', unpack('L', $DataEnd));
  16.             if ($ipend < 0)
  17.                 $ipend += pow(2, 32);
  18.             $ipAllNum = ($ipend - $ipbegin) / 7 + 1;
  19.             $BeginNum = 0;
  20.             $EndNum = $ipAllNum;
  21.             while ($ip1num > $ipNum || $ip2num < $ipNum) {
  22.                 $Middle = intval(($EndNum + $BeginNum) / 2);
  23.                 fseek($fd, $ipbegin + 7 * $Middle);
  24.                 $ipData1 = fread($fd, 4);
  25.                 if (strlen($ipData1) < 4) {
  26.                     fclose($fd);
  27.                     return - 1; //系统错误
  28.                 }
  29.                 $ip1num = implode('', unpack('L', $ipData1));
  30.                 if ($ip1num < 0)
  31.                     $ip1num += pow(2, 32);
  32.                 if ($ip1num > $ipNum) {
  33.                     $EndNum = $Middle;
  34.                     continue;
  35.                 }
  36.                 $DataSeek = fread($fd, 3);
  37.                 if (strlen($DataSeek) < 3) {
  38.                     fclose($fd);
  39.                     return - 1; //系统错误
  40.                 }
  41.                 $DataSeek = implode('', unpack('L', $DataSeek . chr(0)));
  42.                 fseek($fd, $DataSeek);
  43.                 $ipData2 = fread($fd, 4);
  44.                 if (strlen($ipData2) < 4) {
  45.                     fclose($fd);
  46.                     return - 1; //系统错误
  47.                 }
  48.                 $ip2num = implode('', unpack('L', $ipData2));
  49.                 if ($ip2num < 0)
  50.                     $ip2num += pow(2, 32);
  51.                 if ($ip2num < $ipNum) {
  52.                     if ($Middle == $BeginNum) {
  53.                         fclose($fd);
  54.                         return - 2; //未知IP地址
  55.                     }
  56.                     $BeginNum = $Middle;
  57.                 }
  58.             }
  59.             $ipFlag = fread($fd, 1);
  60.             if ($ipFlag == chr(1)) {
  61.                 $ipSeek = fread($fd, 3);
  62.                 if (strlen($ipSeek) < 3) {
  63.                     fclose($fd);
  64.                     return - 1; //系统错误
  65.                 }
  66.                 $ipSeek = implode('', unpack('L', $ipSeek . chr(0)));
  67.                 fseek($fd, $ipSeek);
  68.                 $ipFlag = fread($fd, 1);
  69.             }
  70.             if ($ipFlag == chr(2)) {
  71.                 $AddrSeek = fread($fd, 3);
  72.                 if (strlen($AddrSeek) < 3) {
  73.                     fclose($fd);
  74.                     return - 1; //系统错误
  75.                 }
  76.                 $ipFlag = fread($fd, 1);
  77.                 if ($ipFlag == chr(2)) {
  78.                     $AddrSeek2 = fread($fd, 3);
  79.                     if (strlen($AddrSeek2) < 3) {
  80.                         fclose($fd);
  81.                         return - 1; //系统错误
  82.                     }
  83.                     $AddrSeek2 = implode('', unpack('L', $AddrSeek2 . chr(0)));
  84.                     fseek($fd, $AddrSeek2);
  85.                 } else {
  86.                     fseek($fd, - 1, SEEK_CUR);
  87.                 }
  88.                 while (($char = fread($fd, 1)) != chr(0))
  89.                     $ipAddr2 .= $char;
  90.                 $AddrSeek = implode('', unpack('L', $AddrSeek . chr(0)));
  91.                 fseek($fd, $AddrSeek);
  92.                 while (($char = fread($fd, 1)) != chr(0))
  93.                     $ipAddr1 .= $char;
  94.             } else {
  95.                 fseek($fd, - 1, SEEK_CUR);
  96.                 while (($char = fread($fd, 1)) != chr(0))
  97.                     $ipAddr1 .= $char;
  98.                 $ipFlag = fread($fd, 1);
  99.                 if ($ipFlag == chr(2)) {
  100.                     $AddrSeek2 = fread($fd, 3);
  101.                     if (strlen($AddrSeek2) < 3) {
  102.                         fclose($fd);
  103.                         return - 1; //系统错误
  104.                     }
  105.                     $AddrSeek2 = implode('', unpack('L', $AddrSeek2 . chr(0)));
  106.                     fseek($fd, $AddrSeek2);
  107.                 } else {
  108.                     fseek($fd, - 1, SEEK_CUR);
  109.                 }
  110.                 while (($char = fread($fd, 1)) != chr(0))
  111.                     $ipAddr2 .= $char;
  112.             }
  113.             fclose($fd);
  114.             if (preg_match('/http/i', $ipAddr2)) {
  115.                 $ipAddr2 = '';
  116.             }
  117.             $ipaddr = "$ipAddr1 $ipAddr2";
  118.             $ipaddr = preg_replace('/CZ88\.NET/is', '', $ipaddr);
  119.             $ipaddr = preg_replace('/^\s*/is', '', $ipaddr);
  120.             $ipaddr = preg_replace('/\s*$/is', '', $ipaddr);
  121.             if (preg_match('/http/i', $ipaddr) || $ipaddr == '') {
  122.                 $ipaddr = 'Unknown';
  123.             }
  124.             /* 如果需要返回数组形式信息则去掉以下注释(当对方处在与您同一局域网中或传入127.0.0.1时无法识别)
  125.              * $dataArray = explode(' ', $addr);
  126.              * $addr = $dataArray[0];
  127.              * preg_match("/(.*)省.*/", $addr, $province);
  128.              * preg_match("/.*省(.*)市/", $addr, $city);
  129.              * 第一个元素为省信息,第二个元素为市信息,第三个元素为运营商信息
  130.              * return array($province[1] , $city[1],$dataArray[1]);
  131.              */
  132.              //此处返回字符串形式地址
  133.              return $addr;
  134.         } else {
  135.             $datadir = DISCUZ_ROOT . './ipdata/';
  136.             $ip_detail = explode('.', $ip);
  137.             if (file_exists($datadir . $ip_detail[0] . '.txt')) {
  138.                 $ip_fdata = @fopen($datadir . $ip_detail[0] . '.txt', 'r');
  139.             } else {
  140.                 if (! ($ip_fdata = @fopen($datadir . '0.txt', 'r'))) {
  141.                     return - 3; //IP库未知
  142.                 }
  143.             }
  144.             for ($i = 0; $i <= 3; $i ++) {
  145.                 $ip_detail[$i] = sprintf('%03d', $ip_detail[$i]);
  146.             }
  147.             $ip = join('.', $ip_detail);
  148.             do {
  149.                 $ip_data = fgets($ip_fdata, 200);
  150.                 $ip_data_detail = explode('|', $ip_data);
  151.                 if ($ip >= $ip_data_detail[0] && $ip <= $ip_data_detail[1]) {
  152.                     fclose($ip_fdata);
  153.                     return $ip_data_detail[2] . $ip_data_detail[3];
  154.                 }
  155.             } while (! feof($ip_fdata));
  156.             fclose($ip_fdata);
  157.             return - 2; //IP地址错误
  158.         }
  159.     }

上面的函数我自己改了下,楼主可以根据需要再进行更改
值得注意的是,如果IP地址错误或未知则会返回数字码,另外如果楼主本地实验,也就是说如果传入了127.0.0.1,那么将返回一个字符串“本机地址”,如果楼主在局域网中,传入局域网中另一台电脑的IP,则会提示对方和您在同一网络中。具体楼主可以自己实验下,不过在服务器上运行应该是没有问题的。调用方法为
复制代码
  1. convertip($ip);

另外附给楼主QQ纯真IP库,只要将包含上面这个函数的文件和QQ纯真IP库放在同一目录即可使用,或者使用函数的第二个参数传入IP库所在路径。记得这个IP库可不是自动更新的哦

作者: huaihuajio   发布时间: 2010-09-04

额?IP库没有传上来?
貌似有点大了 4M
楼主给偶留言留下个邮箱或者自己到网上找一下也可以

作者: huaihuajio   发布时间: 2010-09-04