Home  >  Article  >  CMS Tutorial  >  In-depth knowledge of how Empire CMS jumps to different pages based on IP address

In-depth knowledge of how Empire CMS jumps to different pages based on IP address

silencement
silencementforward
2019-11-29 13:26:562702browse

In-depth knowledge of how Empire CMS jumps to different pages based on IP address

The example in this article describes how Empire CMS jumps to different pages based on IP. Share it with everyone for your reference.

The specific implementation code is as follows:

The code is as follows:

<?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;
?>

Recommended to study "Empire cms tutorial"

Above After the method obtains the client IP address, it then passes in the convertip function to convert it into a real address. The convertip($ip) function code is as follows:

The code is as follows:

//===================================
// 功能:IP地址获取真实地址函数
// 参数:$ip - IP地址
//===================================
function convertip($ip) {
//IP数据文件路径
$dat_path = &#39;QQWry.dat&#39;;
//检查IP地址
if(!ereg("^([0-9]{1,3}.){3}[0-9]{1,3}$", $ip)){
return &#39;IP Address Error&#39;;
}
//打开IP数据文件
if(!$fd = @fopen($dat_path, &#39;rb&#39;)){
return &#39;IP date file not exists or access denied&#39;;
}
//分解IP进行运算,得出整形数
$ip = explode(&#39;.&#39;, $ip);
$ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];
//获取IP数据索引开始和结束位置
$DataBegin = fread($fd, 4);
$DataEnd = fread($fd, 4);
$ipbegin = implode(&#39;&#39;, unpack(&#39;L&#39;, $DataBegin));
if($ipbegin < 0) $ipbegin += pow(2, 32);
$ipend = implode(&#39;&#39;, unpack(&#39;L&#39;, $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 &#39;System Error&#39;;
}
//提取出来的数据转换成长整形,如果数据是负数则加上2的32次幂
$ip1num = implode(&#39;&#39;, unpack(&#39;L&#39;, $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 &#39;System Error&#39;;
}
$DataSeek = implode(&#39;&#39;, unpack(&#39;L&#39;, $DataSeek.chr(0)));
fseek($fd, $DataSeek);
$ipData2 = fread($fd, 4);
if(strlen($ipData2) < 4) {
fclose($fd);
return &#39;System Error&#39;;
}
$ip2num = implode(&#39;&#39;, unpack(&#39;L&#39;, $ipData2));
if($ip2num < 0) $ip2num += pow(2, 32);
//没找到提示未知
if($ip2num < $ipNum) {
if($Middle == $BeginNum) {
fclose($fd);
return &#39;Unknown&#39;;
}
$BeginNum = $Middle;
}
}
//下面的代码读晕了,没读明白,有兴趣的慢慢读
$ipFlag = fread($fd, 1);
if($ipFlag == chr(1)) {
$ipSeek = fread($fd, 3);
if(strlen($ipSeek) < 3) {
fclose($fd);
return &#39;System Error&#39;;
}
$ipSeek = implode(&#39;&#39;, unpack(&#39;L&#39;, $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 &#39;System Error&#39;;
}
$ipFlag = fread($fd, 1);
if($ipFlag == chr(2)) {
$AddrSeek2 = fread($fd, 3);
if(strlen($AddrSeek2) < 3) {
fclose($fd);
return &#39;System Error&#39;;
}
$AddrSeek2 = implode(&#39;&#39;, unpack(&#39;L&#39;, $AddrSeek2.chr(0)));
fseek($fd, $AddrSeek2);
} else {
fseek($fd, -1, SEEK_CUR);
}
while(($char = fread($fd, 1)) != chr(0))
$ipAddr2 .= $char;
$AddrSeek = implode(&#39;&#39;, unpack(&#39;L&#39;, $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 &#39;System Error&#39;;
}
$AddrSeek2 = implode(&#39;&#39;, unpack(&#39;L&#39;, $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(&#39;/http/i&#39;, $ipAddr2)) {
$ipAddr2 = &#39;&#39;;
}
$ipaddr = "$ipAddr1 $ipAddr2";
$ipaddr = preg_replace(&#39;/CZ88.Net/is&#39;, &#39;&#39;, $ipaddr);
$ipaddr = preg_replace(&#39;/^s*/is&#39;, &#39;&#39;, $ipaddr);
$ipaddr = preg_replace(&#39;/s*$/is&#39;, &#39;&#39;, $ipaddr);
if(preg_match(&#39;/http/i&#39;, $ipaddr) || $ipaddr == &#39;&#39;) {
$ipaddr = &#39;Unknown&#39;;
}
return $ipaddr;
}
?>

When used, pass convertip The function obtains the real address based on the IP address, and then implements the jump function through the following js code:

The code is as follows:

var sf=&#39;&#39;;//此处的sf变量可保存PHP函数获取到的真实地址
if(sf.indexOf("香港")>=0){
window.location.href="http://www.****.com/?香港";
}
else if(sf.indexOf("广东省")>=0){
window.location.href="http://www.****.com/?广东";
}

I hope this article will be helpful to everyone’s Imperial CMS website building .

The above is the detailed content of In-depth knowledge of how Empire CMS jumps to different pages based on IP address. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:www.word666.com. If there is any infringement, please contact admin@php.cn delete