您好,欢迎访问一九零五行业门户网

根据访客所在城市ip地址自动跳转到分站的php代码

//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     $ipend = implode('', unpack('l', $dataend));
    if($ipend     $ipallnum = ($ipend - $ipbegin) / 7 + 1;
    $beginnum = 0;
    $endnum = $ipallnum;
    //使用二分查找法从索引记录中搜索匹配的ip记录
    while($ip1num>$ipnum || $ip2num        $middle= intval(($endnum + $beginnum) / 2);
        //偏移指针到索引位置读取4个字节
        fseek($fd, $ipbegin + 7 * $middle);
        $ipdata1 = fread($fd, 4);
        if(strlen($ipdata1)             fclose($fd);
            return 'system error';
        }
        //提取出来的数据转换成长整形,如果数据是负数则加上2的32次幂
        $ip1num = implode('', unpack('l', $ipdata1));
        if($ip1num         //提取的长整型数大于我们ip地址则修改结束位置进行下一次循环
        if($ip1num > $ipnum) {
            $endnum = $middle;
            continue;
        }
        //取完上一个索引后取下一个索引
        $dataseek = fread($fd, 3);
        if(strlen($dataseek)             fclose($fd);
            return 'system error';
        }
        $dataseek = implode('', unpack('l', $dataseek.chr(0)));
        fseek($fd, $dataseek);
        $ipdata2 = fread($fd, 4);
        if(strlen($ipdata2)             fclose($fd);
            return 'system error';
        }
        $ip2num = implode('', unpack('l', $ipdata2));
        if($ip2num         //没找到提示未知
        if($ip2num             if($middle == $beginnum) {
                fclose($fd);
                return 'unknown';
            }
            $beginnum = $middle;
        }
    }
    //下面的代码读晕了,没读明白,有兴趣的慢慢读
    $ipflag = fread($fd, 1);
    if($ipflag == chr(1)) {
        $ipseek = fread($fd, 3);
        if(strlen($ipseek)             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)             fclose($fd);
            return 'system error';
        }
        $ipflag = fread($fd, 1);
        if($ipflag == chr(2)) {
            $addrseek2 = fread($fd, 3);
            if(strlen($addrseek2)                 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)                 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;
}
?>
其它类似信息

推荐信息