PHP获取IP地址及根据IP判断城市实现城市切换或跳转

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地址或城市的用户访问,自己研究一下吧,也挺简单的:)

原文: http://blog.sina.com.cn/s/blog_5a8b8eb80100t1je.html

PHP获取IP地址及根据IP判断城市实现城市切换或跳转,码迷,mamicode.com

时间: 2024-08-06 16:05:24

PHP获取IP地址及根据IP判断城市实现城市切换或跳转的相关文章

linux c 网络编程:用域名获取IP地址或者用IP获取域名 网络地址转换成整型 主机字符顺序与网络字节顺序的转换

用域名获取IP地址或者用IP获取域名 #include<stdio.h> #include<sys/socket.h> #include<netdb.h> int main(int argc,char **aggv) { struct hostent *host; char hostname[]="www.163.com"; char hostname2[]="www.baidu.com"; struct in_addr in;

ubuntu14.04静态ip地址与动态ip地址配置

有时我们希望Ubuntu14.04的ip地址为静态ip地址,使得ubuntu中的ip地址不变,这样会方便在嵌入式设备和主机Ubuntu进行用网口进行调试. 静态ip地址的配置方法:在/etc/network/interfaces文件中,修改内容为 # interfaces(5) file used by ifup(8) and ifdown(8) auto lo iface lo inet loopback auto eth0 iface eth0 inet static #iface eth0

python编写IP地址与十进制IP转换脚本

IP地址与十进制IP转换 #!/usr/bin/env python #encoding=utf-8 import re import sys import os def ten_to_two(ten_num): two_str = '' while ten_num != 1: a = ten_num % 2 two_str = two_str + str(a) ten_num = ten_num / 2 else: two_str = two_str + str(1) two_str = tw

DNS反射放大攻击分析——DNS反射放大攻击主要是利用DNS回复包比请求包大的特点,放大流量,伪造请求包的源IP地址为受害者IP,将应答包的流量引入受害的服务器

DNS反射放大攻击分析 摘自:http://www.shaojike.com/2016/08/19/DNS%E6%94%BE%E5%A4%A7%E6%94%BB%E5%87%BB%E7%AE%80%E5%8D%95%E5%88%86%E6%9E%90/ 简介 DNS反射放大攻击主要是利用DNS回复包比请求包大的特点,放大流量,伪造请求包的源IP地址为受害者IP,将应答包的流量引入受害的服务器. 简单对比下正常的DNS查询和攻击者的攻击方式: 正常DNS查询:源IP地址 -–DNS查询--> DN

我的 IP 地址(View IP address)

插件介绍: 很多时候我们需要使用到IP地址,这个名词可能人人都知道,但是你知道怎么查看你自己的IP地址吗?今天为大家推荐一款查看IP地址的插件.我的 IP 地址(View IP address),此应用程序显示有关您的 IP 地址,例如地理定位. ISP. DNS,详细的信息 whois,路由. 托管. 域的邻居,DNSBL,BGP 和 ASN 信息. 使用说明: 将我的 IP 地址(View IP address)添加至chrome,并在扩展器中启动它. 功能介绍: -像 ISP. ASN.

(转)ip地址,手机ip查询

页面地址:http://www.ip138.com/ 外链地址(实际主页面里面有)http://www.ip138.com/iplink.htm 外链地址里面的内容: <FORM METHOD=get ACTION="http://www.ip138.com/ips1388.asp" name="ipform" target="_blank"><tr><td align="center">I

清除被隐藏网卡占用的IP地址,本机IP地址被占用

清除被隐藏网卡及占用的IP地址,本机IP地址被占用当主机中的网卡更换或换了一个插槽时,还要用到原来网卡的IP地址,但系统提示IP地址已经被本机中网卡占用,而主机里确实只有刚插入的网卡,这个原因就是以前插入的网卡占用了该IP地址,但它隐藏了,我们删不到它,在XP/2K3系统中解决方法如下: 方法一.在运行中输入regedit,打开注册表编辑器,找到"HKEY-LOCAL-MACHINE\System\ControlSet001\coontrol\sessionmanage\Environment,

关于公共IP地址(公网ip):您需要知道的

目录:? 什么是公共ip地址?? 私有IP与公共IP地址? 公共IP地址范围? 如何查找您的公共IP地址? 动态ip? 隐藏您的公共IP地址 什么是公共ip地址? 公共IP地址是您的家庭或企业路由器从ISP接收的IP地址.任何可公开访问的网络硬件都需要公共IP地址,例如家庭路由器以及托管网站的服务器.公共IP地址是插入公共互联网的所有设备的不同之处.每个访问互联网的设备都使用唯一的IP地址.实际上,公共IP地址有时被称为Internet IP. 这是每个互联网服务提供商用于将互联网请求转发到特定

oracle 中如何获取本机ip地址,根据IP地址获取域名?

-----解析ip 地址 SQL> select utl_inaddr.get_host_address('google.com') from dual; UTL_INADDR.GET_HOST_ADDRESS('GOOGLE.COM') -------------------------------------------------------------------------------- 122.229.30.202 -----获取本机IP地址 SQL> select utl_ina