找回密码
 会员注册
查看: 639|回复: 0

网站如何根据IP判断城市实现城市切换或跳转

[复制链接]

1389

主题

5

回帖

496万

积分

管理员

积分
4962986
发表于 2023-1-9 17:35:32 | 显示全部楼层 |阅读模式

PHP获取IP地址

这个比较简单了,利用PHP自带函数就可以了,PHP中文手册看一下,都有现成的例子,就不过多说明了,直接上代码,A段:



  • <?



  • //PHP获取当前用户IP地址方法



  • $xp_UserIp = ($_SERVER["HTTP_VIA"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"];



  • $xp_UserIp = ($xp_UserIp) ? $xp_UserIp : $_SERVER["REMOTE_ADDR"];



  • ?>




附:最新腾讯QQ IP数据库 2011.04.10 纯真版下载

使用方法:解压后QQWry.Dat就是我们想要IP地址数据库,我们新建一个ipcity文件夹,将数据库放在下面。QQ IP数据库使用非常方便,数据也很齐全,你可以及时关注官方更新以保持数据最新,强力推荐一下:)

接下来,我们在上面的ipcity目录下新建一个ipaddress.php文件,直接复制以下代码进去即可,重要的地方也作了相应注释。




  • <?















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



  • }



  • ?>





PHP根据IP地址实现城市切换或跳转

到这里,其实问题已经很简单了,用简单的js就通通搞定。C段如下:




  • //根据IP地址跳转指定页面js取得城市







  • var city='<?echo ipCity($xp_UserIp);?>';







  • //根据IP地址所有城市跳转到指定页面



  • if(city.indexOf("上海市")>=0){



  •   window.location.href="http://shanghai.demo.com/";



  • }




将开头的A段代码和上面的C段代码分别放在B段代码的头和尾,然后我们在需要跳转的页面加入以下代码:

<script src="/ipcity/ipaddress.php" type="text/javascript" language="javascript"></script>

刷新页面,是不是达到预想的效果了呢?

以上就是PHP获取IP地址、PHP根据IP地址判断城市以及PHP根据IP地址实现城市切换或跳转的详细介绍了,事实上,像PHP中通过IP地址自动切 换城市就是这个方法的典型应用。举一反三,我们通过这种方法,也可以实现屏蔽指定IP地址或城市的用户访问,自己研究一下吧,也挺简单的:)


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-24 10:10 , Processed in 0.401778 second(s), 27 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表