php获取客户端真实ip
,这里通过超全局变量$_SERVER
进行获取ip。在获取ip时,可以通过 $_SERVER['REMOTE_ADDR']
就能直接得到ip,但通过$_SERVER['REMOTE_ADDR']
获取ip时有可能是获取到用户代理服务器的ip
,而代理服务器下的用户真实ip就需要使用$_SERVER['HTTP_X_FORWARDED_FOR']
进行获取了,如果用户没有使用代理服务器$_SERVER['HTTP_X_FORWARDED_FOR']
就会返回空。所以就有必要下面代码里的那么多判断了。
获取ip步骤:
代理服务器ip($_SERVER['HTTP_X_FORWARDED_FOR'])[可在http请求头中伪造]
↓
客户端ip($_SERVER['HTTP_CLIENT_IP'])[可在http请求头中伪造]
↓
真实的远程的客户端ip($_SERVER['REMOTE_ADDR'])[不能伪造,位于tcp/ip协议数据包中]
php获取客户端真实ip代码如下:
php<?php/*获取客户端真实的IP*/function GetIps(){ $realip = ''; $unknown = 'unknown'; if (isset($_SERVER)){ if(isset($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty($_SERVER['HTTP_X_FORWARDED_FOR']) && strcasecmp($_SERVER['HTTP_X_FORWARDED_FOR'], $unknown)){ $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); foreach($arr as $ip){ $ip = trim($ip); if ($ip != 'unknown'){ $realip = $ip; break; } } }else if(isset($_SERVER['HTTP_CLIENT_IP']) && !empty($_SERVER['HTTP_CLIENT_IP']) && strcasecmp($_SERVER['HTTP_CLIENT_IP'], $unknown)){ $realip = $_SERVER['HTTP_CLIENT_IP']; }else if(isset($_SERVER['REMOTE_ADDR']) && !empty($_SERVER['REMOTE_ADDR']) && strcasecmp($_SERVER['REMOTE_ADDR'], $unknown)){ $realip = $_SERVER['REMOTE_ADDR']; }else{ $realip = $unknown; } } $realip = preg_match("/[d.]{7,15}/", $realip, $matches) ? $matches[0] : $unknown; return $realip;} /*把IP传入新浪API返回数据获取ip的真实归属地*/function GetIpFrom($ip = ''){ if(empty($ip)){ $ip = GetIps(); } $res = @file_get_contents('http://ip.taobao.com/service/getIpInfo.php?ip='.$ip); return $res;}
上面的方式获取ip时虽然会有伪造的可能,但也有参考的意义,在一些常用的网站访问情况可以满足,但如果在一些投票网站、购买支付类网站接口还是以 $_SERVER['REMOTE_ADDR']为准会好些。
获得ip归属地信息的API地址:
淘宝官方API:http://ip.taobao.com/
淘宝接口地址:http://ip.taobao.com/service/getIpInfo.php?ip=IPAddress
百度官方API: http://apistore.baidu.com/apiworks/servicedetail/114.html
百度接口地址:http://apis.baidu.com/apistore/iplookupservice/iplookup