0

0

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

php中文网

php中文网

发布时间:2016-06-23 13:46:48

|

915人浏览过

|

来源于php中文网

原创

我做了个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切换城市的这是公共调用文件的一部分

网站只有一个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>

中,无论 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>

中,无论 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页面,这样的话就会出现不停跳转。

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

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


我没有写死啊,

点点
点点

小红书打造的AI生活搜索助手

下载
<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>

这句我只是放了个例子,具体程序我还没写到里面去,只是测试一下就出来问题了,主要就是网址打开最先访问的都是这个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'].""); }}?>

如果用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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

1142

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

371

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

245

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

37

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

114

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

77

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

17

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

863

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

123

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号