PHP根据IP跳转不同城市代码
www.jz123.cn 2009-12-14 来源: 中国建站 责任编辑(袁袁) 我要投递新闻
<?
//php获取ip的算法
$user_IP = ($_SERVER["HTTP_VIA"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"];
$user_IP = ($user_IP) ? $user_IP : $_SERVER["REMOTE_ADDR"];
//echo $user_IP;
?>
<?
//===================================
//
// 功能:IP地址获取真实地址函数
// 参数:$ip - IP地址
// 作者:[Discuz!] (C) Comsenz Inc.
//
//===================================
function convertip($ip) {
     //IP数据文件路径
     $dat_path = 'QQWry.dat';
     //检查IP地址
     if(!ereg("^([0-9]{1,3}.){3}[0-9]{1,3}$", $ip)){
         return 'IP Address Error';
     }
     //打开IP数据文件
     if(!$fd = @fopen($dat_path, 'rb')){
         return 'IP date file not exists or access denied';
     }
     //分解IP进行运算,得出整形数
     $ip = explode('.', $ip);
     $ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];
     //获取IP数据索引开始和结束位置
     $DataBegin = fread($fd, 4);
     $DataEnd = fread($fd, 4);
     $ipbegin = implode('', unpack('L', $DataBegin));
     if($ipbegin < 0) $ipbegin += pow(2, 32);
     $ipend = implode('', unpack('L', $DataEnd));
     if($ipend < 0) $ipend += pow(2, 32);
     $ipAllNum = ($ipend - $ipbegin) / 7 + 1;
     $BeginNum = 0;
     $EndNum = $ipAllNum;
     //使用二分查找法从索引记录中搜索匹配的IP记录
     while($ip1num>$ipNum || $ip2num<$ipNum) {
         $Middle= intval(($EndNum + $BeginNum) / 2);
         //偏移指针到索引位置读取4个字节
         fseek($fd, $ipbegin + 7 * $Middle);
         $ipData1 = fread($fd, 4);
         if(strlen($ipData1) < 4) {
             fclose($fd);
             return 'System Error';
         }
         //提取出来的数据转换成长整形,如果数据是负数则加上2的32次幂
         $ip1num = implode('', unpack('L', $ipData1));
         if($ip1num < 0) $ip1num += pow(2, 32);
         //提取的长整型数大于我们IP地址则修改结束位置进行下一次循环
         if($ip1num > $ipNum) {
             $EndNum = $Middle;
             continue;
         }
         //取完上一个索引后取下一个索引
         $DataSeek = fread($fd, 3);
         if(strlen($DataSeek) < 3) {
             fclose($fd);
             return 'System Error';
         }
         $DataSeek = implode('', unpack('L', $DataSeek.chr(0)));
         fseek($fd, $DataSeek);
         $ipData2 = fread($fd, 4);
         if(strlen($ipData2) < 4) {
             fclose($fd);
             return 'System Error';
         }
         $ip2num = implode('', unpack('L', $ipData2));
         if($ip2num < 0) $ip2num += pow(2, 32);
         //没找到提示未知
         if($ip2num < $ipNum) {
             if($Middle == $BeginNum) {
                 fclose($fd);
                 return 'Unknown';
             }
             $BeginNum = $Middle;
         }
     }
     //下面的代码读晕了,没读明白,有兴趣的慢慢读
     $ipFlag = fread($fd, 1);
     if($ipFlag == chr(1)) {
         $ipSeek = fread($fd, 3);
         if(strlen($ipSeek) < 3) {
             fclose($fd);
             return 'System Error';
         }
         $ipSeek = implode('', unpack('L', $ipSeek.chr(0)));
         fseek($fd, $ipSeek);
         $ipFlag = fread($fd, 1);
     }
     if($ipFlag == chr(2)) {
         $AddrSeek = fread($fd, 3);
         if(strlen($AddrSeek) < 3) {
             fclose($fd);
             return 'System Error';
         }
         $ipFlag = fread($fd, 1);
         if($ipFlag == chr(2)) {
             $AddrSeek2 = fread($fd, 3);
             if(strlen($AddrSeek2) < 3) {
                 fclose($fd);
                 return 'System Error';
             }
             $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
             fseek($fd, $AddrSeek2);
         } else {
             fseek($fd, -1, SEEK_CUR);
         }
         while(($char = fread($fd, 1)) != chr(0))
             $ipAddr2 .= $char;
         $AddrSeek = implode('', unpack('L', $AddrSeek.chr(0)));
         fseek($fd, $AddrSeek);
         while(($char = fread($fd, 1)) != chr(0))
             $ipAddr1 .= $char;
     } else {
         fseek($fd, -1, SEEK_CUR);
         while(($char = fread($fd, 1)) != chr(0))
             $ipAddr1 .= $char;
         $ipFlag = fread($fd, 1);
         if($ipFlag == chr(2)) {
             $AddrSeek2 = fread($fd, 3);
             if(strlen($AddrSeek2) < 3) {
                 fclose($fd);
                 return 'System Error';
             }
             $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
             fseek($fd, $AddrSeek2);
         } else {
             fseek($fd, -1, SEEK_CUR);
         }
         while(($char = fread($fd, 1)) != chr(0)){
             $ipAddr2 .= $char;
         }
     }
     fclose($fd);
     //最后做相应的替换操作后返回结果
     if(preg_match('/http/i', $ipAddr2)) {
         $ipAddr2 = '';
     }
     $ipaddr = "$ipAddr1 $ipAddr2";
     $ipaddr = preg_replace('/CZ88.Net/is', '', $ipaddr);
     $ipaddr = preg_replace('/^s*/is', '', $ipaddr);
     $ipaddr = preg_replace('/s*$/is', '', $ipaddr);
     if(preg_match('/http/i', $ipaddr) || $ipaddr == '') {
         $ipaddr = 'Unknown';
     }
     return $ipaddr;
}
?>
var sf='<?echo convertip($user_IP);?>';
if(sf.indexOf("香港")>=0){
         window.location.href="http://www.jz123.cn/?香港";
}
else if(sf.indexOf("广东省")>=0){
         window.location.href="http://www.jz123.cn/?广东";
}
//注释A
  用法:
1.下载纯真IP数据库 下载地址 http://download.jz123.cn/2008/qqwry.rar
我们只用里面的 QQWry.Dat
2.把我发的代码存为ip.php
3.把1跟2的文件均放在同一个文件夹里,比如你放在文件夹 /ipcity/
4.在需要的页面插入<script src="/ipcity/ip.php"></script> ,
5.如果你需要跳转更多的城市,那么只需要在注释A上面 添加以下代码
else if(sf.indexOf("省份或者城市")>=0){
         window.location.href="http://www.jz123.cn/?跳转到的省份或城市";
}
文章来自中国建站:http://www.jz123.cn/text/1425255.html
- 最新评论
