我做了个ip判断城市进行跳转,放到公共文件就出现不停访问跳转了

WBOY
Release: 2016-06-23 13:46:48
Original
811 people have browsed it

我做了个ip判断城市进行二级域名跳转,文件为ipaddress.php,把文件放在公共条用文件里面打开网址就会出现不停访问跳转,现在有什么办法实现这个跳转但不会出现这种无休止访问的问题,我有想到利用cookies,但不知道下来该怎么做,哪位长老帮下忙。


回复讨论(解决方案)

你所谓的公共文件是不是被很多其他文件包含进去了?

你所谓的公共文件是不是被很多其他文件包含进去了?


类文件、配置文件、公共函数文件、分页函数文件之类的走在一个init.php里面,这个init.php就是公共文件,每个页面都会调用到

贴出你的代码
不知道你是怎么写的,如何知道怎么改?

<?function GetIP() {    if ($_SERVER["HTTP_X_FORWARDED_FOR"])        $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];    else if ($_SERVER["HTTP_CLIENT_IP"])        $ip = $_SERVER["HTTP_CLIENT_IP"];    else if ($_SERVER["REMOTE_ADDR"])        $ip = $_SERVER["REMOTE_ADDR"];    else if (getenv("HTTP_X_FORWARDED_FOR"))        $ip = getenv("HTTP_X_FORWARDED_FOR");    else if (getenv("HTTP_CLIENT_IP"))        $ip = getenv("HTTP_CLIENT_IP");    else if (getenv("REMOTE_ADDR"))        $ip = getenv("REMOTE_ADDR");    else        $ip = "Unknown";    return $ip;}$userip=GetIP();/*函数名称:ipCity参数说明:$userip??用户IP地址函数功能:PHP通过IP地址判断用户所在城市author:leecontact:xpsem2010@gmail.com*/function ipCity($userip) {    //IP数据库路径,这里用的是QQ IP数据库 20110405 纯真版    $dat_path = 'qqwry.dat';    //判断IP地址是否有效    if(!ereg("^([0-9]{1,3}.){3}[0-9]{1,3}$", $userip)){        return 'IP Address Invalid';    }    //打开IP数据库    if(!$fd = @fopen($dat_path, 'rb')){        return 'IP data file not exists or access denied';    }    //explode函数分解IP地址,运算得出整数形结果    $userip = explode('.', $userip);    $useripNum = $userip[0] * 16777216 + $userip[1] * 65536 + $userip[2] * 256 + $userip[3];    //获取IP地址索引开始和结束位置    $DataBegin = fread($fd, 4);    $DataEnd = fread($fd, 4);    $useripbegin = implode('', unpack('L', $DataBegin));    if($useripbegin < 0) $useripbegin += pow(2, 32);    $useripend = implode('', unpack('L', $DataEnd));    if($useripend < 0) $useripend += pow(2, 32);    $useripAllNum = ($useripend - $useripbegin) / 7 + 1;    $BeginNum = 0;    $EndNum = $useripAllNum;    //使用二分查找法从索引记录中搜索匹配的IP地址记录    while($userip1num>$useripNum || $userip2num<$useripNum) {        $Middle= intval(($EndNum + $BeginNum) / 2);        //偏移指针到索引位置读取4个字节        fseek($fd, $useripbegin + 7 * $Middle);        $useripData1 = fread($fd, 4);        if(strlen($useripData1) < 4) {            fclose($fd);            return 'File Error';        }        //提取出来的数据转换成长整形,如果数据是负数则加上2的32次幂        $userip1num = implode('', unpack('L', $useripData1));        if($userip1num < 0) $userip1num += pow(2, 32);        //提取的长整型数大于我们IP地址则修改结束位置进行下一次循环        if($userip1num > $useripNum) {            $EndNum = $Middle;            continue;        }        //取完上一个索引后取下一个索引        $DataSeek = fread($fd, 3);        if(strlen($DataSeek) < 3) {            fclose($fd);            return 'File Error';        }        $DataSeek = implode('', unpack('L', $DataSeek.chr(0)));        fseek($fd, $DataSeek);        $useripData2 = fread($fd, 4);        if(strlen($useripData2) < 4) {            fclose($fd);            return 'File Error';        }        $userip2num = implode('', unpack('L', $useripData2));        if($userip2num < 0) $userip2num += pow(2, 32);        //找不到IP地址对应城市        if($userip2num < $useripNum) {            if($Middle == $BeginNum) {                fclose($fd);                return 'No Data';            }            $BeginNum = $Middle;        }    }    $useripFlag = fread($fd, 1);    if($useripFlag == chr(1)) {        $useripSeek = fread($fd, 3);        if(strlen($useripSeek) < 3) {            fclose($fd);            return 'System Error';        }        $useripSeek = implode('', unpack('L', $useripSeek.chr(0)));        fseek($fd, $useripSeek);        $useripFlag = fread($fd, 1);    }    if($useripFlag == chr(2)) {        $AddrSeek = fread($fd, 3);        if(strlen($AddrSeek) < 3) {            fclose($fd);            return 'System Error';        }        $useripFlag = fread($fd, 1);        if($useripFlag == 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))            $useripAddr2 .= $char;        $AddrSeek = implode('', unpack('L', $AddrSeek.chr(0)));        fseek($fd, $AddrSeek);        while(($char = fread($fd, 1)) != chr(0))            $useripAddr1 .= $char;    } else {        fseek($fd, -1, SEEK_CUR);        while(($char = fread($fd, 1)) != chr(0))            $useripAddr1 .= $char;        $useripFlag = fread($fd, 1);        if($useripFlag == 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)){            $useripAddr2 .= $char;        }    }    fclose($fd);    //返回IP地址对应的城市结果    if(preg_match('/http/i', $useripAddr2)) {        $useripAddr2 = '';    }    $useripaddr = "$useripAddr1 $useripAddr2";    $useripaddr = preg_replace('/CZ88.Net/is', '', $useripaddr);    $useripaddr = preg_replace('/^s*/is', '', $useripaddr);    $useripaddr = preg_replace('/s*$/is', '', $useripaddr);    if(preg_match('/http/i', $useripaddr) || $useripaddr == '') {        $useripaddr = 'No Data';    }    return $useripaddr;}?><script language="javascript">var city='<?php echo ipCity($userip);?>';if(city.indexOf("西宁市")>=0){window.location.href="http://www.js0971.com/";}else{window.location.href="http://bj.0971my.com/";}</script>这个是ipaddress.php页面require (ROOT_PATH . 'include/config.php');require (ROOT_PATH . 'include/smarty/Smarty.class.php');require (ROOT_PATH . 'include/mysql.class.php');require (ROOT_PATH . 'include/action.class.php');require (ROOT_PATH . 'include/check.class.php');require (ROOT_PATH . 'include/page.class.php');require (ROOT_PATH . 'include/ipaddress.php');   这个是判断ip切换城市的这是公共调用文件的一部分
Copy after login

网站只有一个index.php页面

<script language="javascript">var city='<?php echo ipCity($userip);?>';if(city.indexOf("西宁市")>=0){window.location.href="http://www.js0971.com/";}else{window.location.href="http://bj.0971my.com/";}</script>
Copy after login
Copy after login
Copy after login
中,无论 city 是什么内容,总是要跳转的
那么你究竟想转到哪里去?

<script language="javascript">var city='<?php echo ipCity($userip);?>';if(city.indexOf("西宁市")>=0){window.location.href="http://www.js0971.com/";}else{window.location.href="http://bj.0971my.com/";}</script>
Copy after login
Copy after login
Copy after login
中,无论 city 是什么内容,总是要跳转的
那么你究竟想转到哪里去?


这里我解释一下,这个我还没有添加动态程序,默认打开直接就是 http://www.0971my.com,如果在西宁市的话打开也是 http://www.0971my.com,如果是其他城市则跳转至二级域名

既然你默认打开的是 http://www.js0971.com/
那么在 西宁市 就不需要跳转了
if(city.indexOf("西宁市")>=0){
//window.location.href="http://www.js0971.com/";
}else{
window.location.href="http://bj.0971my.com/"; //不是西宁市才需要跳转
}

既然你默认打开的是 http://www.js0971.com/
那么在 西宁市 就不需要跳转了
if(city.indexOf("西宁市")>=0){
//window.location.href="http://www.js0971.com/";
}else{
window.location.href="http://bj.0971my.com/"; //不是西宁市才需要跳转
}


现在问题是,只要一打开这个网址就不停的在访问跳转,就是在执行上面那句代码,现在问题是我怎么知道这个IP已经访问过了,直接打开这个城市的域名,而不是一直在跳转

注释掉不就不执行了吗?
难道你在 bj.0971my.com 也判断是否 西宁市 吗?

注释掉不就不执行了吗?
难道你在 bj.0971my.com 也判断是否 西宁市 吗?


版主没明白我的意思呢,二级域名下面也是这个网站,只是城市不同而已,用的都是一个index.php页面,这样的话就会出现不停跳转。

不同的二级域名,判别条件也不同,你都写死了,当然就不行啦

不同的二级域名,判别条件也不同,你都写死了,当然就不行啦


我没有写死啊,
<script language="javascript">var city='<?php echo ipCity($userip);?>';if(city.indexOf("西宁市")>=0){window.location.href="http://www.js0971.com/";}else{window.location.href="http://bj.0971my.com/";}</script>
Copy after login
Copy after login
Copy after login
这句我只是放了个例子,具体程序我还没写到里面去,只是测试一下就出来问题了,主要就是网址打开最先访问的都是这个index.php页面而且是唯一一个页面,区别就是不同城市显示不同东西。现在我要解决的就是怎么实现这个,要怎么做才不会出现我上述的问题。

就是人家58那样,不同城市打开不同的内容,但是都是一个index.php,要么就是人家解析到别的文件夹去了,这个我就不清楚了。

用cookie或session存一个city的标记,例:为0时进入ip判断力跳转,并修改标记city>0

其实你这段 js 代码是不需要的
你既然是根据用户的 ip 跳转对应的二级域名,那么你就应该有一个城市(地区)与二级域名的对照表
当从 ip 取得城市(地区)名时,从此表查得二级域名进行跳转就可以了(header 函数),当然还要和 $_SERVER['HTTP_HOST'] 比较一下,已经是了就不再跳转了

其实你这段 js 代码是不需要的
你既然是根据用户的 ip 跳转对应的二级域名,那么你就应该有一个城市(地区)与二级域名的对照表
当从 ip 取得城市(地区)名时,从此表查得二级域名进行跳转就可以了(header 函数),当然还要和 $_SERVER['HTTP_HOST'] 比较一下,已经是了就不再跳转了


城市(地区)与二级域名的对照表这个我已经有了,这段是我在ipaddress下面判断的代码:
<?php//开始获取城市IP$userip=GetIP();//获取城市$city=ipCity($userip);/*从数据库获取二级域,如果存在则跳转至二级域名,否则直接默认一级域名http://www.0971my.com*/$sql=$db->query("select * from ".$db->table('area')." where title like '%".$city."%'");$row=$db->fetch_array($sql);if(!$row){ header("Location:http//www.0971my.com");}else{ if($row['title']=='西宁市'){  header("Location:http://www.0971my.com"); }else{  header("Location:".$row['dns'].""); }}?>
Copy after login

如果用header()跳转的话,就会直接是这个结果http://www.0971my.com/http//www.0971my.com

地址后面给个标志位比如,transf=1  ,页面首先接受request[""]==1,则不执行判断。
你这样写死了怎么行。。。。

地址后面给个标志位比如,transf=1  ,页面首先接受request[""]==1,则不执行判断。
你这样写死了怎么行。。。。


这样的话点击到其他页面,那transf=1不是丢失了,这是不是还必须的session或者cookies呢?

很简单, 主域名 www.xxx.com
分站域名, bj.xxx.com, xa.xxx.com, gz.xxx.com ....

从www来的请求,根据ip跳转到分站, 分站的代码不需要跳转,简单判断域名然后用header()跳转就好了。

其实你这段 js 代码是不需要的
你既然是根据用户的 ip 跳转对应的二级域名,那么你就应该有一个城市(地区)与二级域名的对照表
当从 ip 取得城市(地区)名时,从此表查得二级域名进行跳转就可以了(header 函数),当然还要和 $_SERVER['HTTP_HOST'] 比较一下,已经是了就不再跳转了


版主你说的这个该怎么去判断呢,望告知,谢谢~!

很简单, 主域名 www.xxx.com
分站域名, bj.xxx.com, xa.xxx.com, gz.xxx.com ....

从www来的请求,根据ip跳转到分站, 分站的代码不需要跳转,简单判断域名然后用header()跳转就好了。


脑子有点短路,不知道你那个具体该怎么操作?

谢谢,各位我已经弄出来了,但是现在还有一个问题么考虑到,就是手动选择城市,这里的cookie是不是跨域访问了?

你针对的是二级域名,指定 setcookie 的4个参数即可

你针对的是二级域名,指定 setcookie 的4个参数即可


谢谢版主的回答,setcookie的参数我已经写出,这个问题我会在另一个提问里面提出来,望版主前去看下,谢谢!
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template