最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

php如何实现根据ip跳转

来源:懂视网 责编:小采 时间:2020-11-02 18:25:39
文档

php如何实现根据ip跳转

php如何实现根据ip跳转:php实现根据ip跳转的方法:首先返回当前IP的城市字符串;然后检查IP地址;接着打开IP数据文件,并分解IP进行运算;最后使用二分查找法从索引记录中搜索匹配的IP记录,并进行相应的替换操作即可。推荐:《PHP视频教程》PHP代码根据IP判断城市并跳转代码:&l
推荐度:
导读php如何实现根据ip跳转:php实现根据ip跳转的方法:首先返回当前IP的城市字符串;然后检查IP地址;接着打开IP数据文件,并分解IP进行运算;最后使用二分查找法从索引记录中搜索匹配的IP记录,并进行相应的替换操作即可。推荐:《PHP视频教程》PHP代码根据IP判断城市并跳转代码:&l

php实现根据ip跳转的方法:首先返回当前IP的城市字符串;然后检查IP地址;接着打开IP数据文件,并分解IP进行运算;最后使用二分查找法从索引记录中搜索匹配的IP记录,并进行相应的替换操作即可。

推荐:《PHP视频教程》

PHP代码根据IP判断城市并跳转

代码:

<?php
//返回当前IP的城市字符串
function convertip($ip) {
 //IP数据文件路径
 $dat_path = 'QQWry.Dat';
 //检查IP地址
 if(!preg_match("/^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$/", $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;
}
//查找字符串
function findstr($str, $substr)
{
 $m = strlen($str);
 $n = strlen($substr );
 if ($m < $n) return false ;
 for ($i=0; $i <=($m-$n+1); $i ++){
 $sub = substr( $str, $i, $n);
 if ( strcmp($sub, $substr) == 0) return true;
 }
 return false ;
}
 
$xp_UserIp = ($_SERVER["HTTP_VIA"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"];
$Clientip = ($xp_UserIp) ? $xp_UserIp : $_SERVER["REMOTE_ADDR"];
$ClientSity=convertip($Clientip);
if (findstr($ClientSity,"北京")){
 //out.print("beijing");
 Header("Location: http://www.qq.com");
}else{
 //out.print("false beijing");
 Header("Location: http://www.163.com");
}
?>

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文档

php如何实现根据ip跳转

php如何实现根据ip跳转:php实现根据ip跳转的方法:首先返回当前IP的城市字符串;然后检查IP地址;接着打开IP数据文件,并分解IP进行运算;最后使用二分查找法从索引记录中搜索匹配的IP记录,并进行相应的替换操作即可。推荐:《PHP视频教程》PHP代码根据IP判断城市并跳转代码:&l
推荐度:
标签: ip php 实现
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top