ホームページ  >  記事  >  バックエンド開発  >  ジャンプ先の都市を決めるIPを作り、それを公開ファイルに置いたらアクセスジャンプが続いた。

ジャンプ先の都市を決めるIPを作り、それを公開ファイルに置いたらアクセスジャンプが続いた。

WBOY
WBOYオリジナル
2016-06-23 13:46:48805ブラウズ

第二レベルドメイン名にジャンプするIP判定都市を作りました。そのファイルを公開記事ファイルに入れてURLを開くと常時アクセスが飛んでしまいます。このジャンプを達成するには、この無限アクセスの問題は発生しません。クッキーを使用することを考えましたが、どうすればよいかわかりません。


ディスカッションへの返信 (解決策)

いわゆるパブリック ファイルは他の多くのファイルに含まれていますか?

いわゆるパブリック ファイルは他の多くのファイルに含まれていますか?


クラス ファイル、設定ファイル、パブリック関数ファイル、ページング関数ファイルなどは 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切换城市的这是公共调用文件的一部分

ウェブサイトには、index.php ページが 1 つだけあります

<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>
では、都市の内容に関係なく、常にジャンプします
それで、どこに行きたいですか?

<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>
では、街が何であれ、常にジャンプします
それで、どこに行きたいですか?


ここで説明しますが、これには動的プログラムを追加していません。西寧市の場合は http://www.0971my.com でも開きます。 0971my.com 他の都市にある場合は、第 2 レベルのドメイン名にジャンプします

デフォルトで 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/"; //リダイレクトする必要があるのは西寧市ではありません
}

今の問題は、開いた瞬間にこの URL にアクセスしてジャンプし続けますが、これにより上記のコードが実行されます。問題は、この IP がすでにアクセスされているかどうかを、常にジャンプするのではなく、直接開くことです。コメントアウトすると実行されないのでしょうか?

bj.0971my.com で西寧市かどうかも判断しますか?

コメントアウトすると実行されないのでしょうか?
bj.0971my.com で西寧市かどうかも判断しますか?

モデレーターは私の意味を理解していませんでした。第 2 レベルのドメイン名も同じ Web サイトですが、都市が異なります。同じ Index.php ページを使用しているため、ジャンプし続けます。


異なる第 2 レベル ドメイン名は異なる判定条件を持ちます。すべてを綴ると、当然機能しません。


異なる第 2 レベル ドメイン名は、異なる判定条件を持ちます。もちろん動作しません。その理由は、URL を開いたときにアクセスされる最初のページがindex.php ページであり、このページの唯一の違いは、都市によって表示される内容が異なることです。私が今解決したいのは、これをどのように実装するか、そして上で述べた問題をどのように回避するかです。

58 のようです。異なる都市では異なるコンテンツが開きますが、それらはすべて同じindex.php であるか、他のフォルダーに解析されます。

Cookie またはセッションを使用して都市マークを保存します。 例: 0 の場合、IP 判定ジャンプを入力してマークを変更します。 city>0


実際には、JS コードは必要ありませんユーザーの IP に対応する第 2 レベルのドメイン名にジャンプすると、都市 (地域) と第 2 レベルのドメイン名の比較表が得られます

IP から都市 (地域) 名を取得するときは、第 2 レベルのドメイン名を検索するだけです。テーブルからレベルのドメイン名を取得してジャンプします(ヘッダー関数)。もちろん $_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'].""); }}?>

如果用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的参数我已经写出,这个问题我会在另一个提问里面提出来,望版主前去看下,谢谢!
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。