服务热线
1888888888
作者:文煞发布时间:2024-06-21分类:PHP笔记浏览:7680
我们在做网站网站的时候,经常会遇到一个问题,比如想要获取访问者的归属地并展示在页面、或者统计到数据库、或者限制某些地方的用户访问!就像一些做本地服务的网站,只需要当地的用户能够正常访问就行了,不想其他地方的游客访问,这样的目的除了不想浪费服务器资源以外还能有效的防止大部分攻击,为本地用户提供更好更安全的网络服务!那么我们如何才能实现这样的目的呢?
如果你的网站脚本语言是PHP,那么我可以告诉你,其实PHP本身并不能直接获取访问者的归属地信息,但我们可以通过一些间接的方式来获取。PHP可以通过$_SERVER['REMOTE_ADDR']获取到访问者的IP地址。然后,你可以使用一些第三方的IP定位库(如MaxMind、IP2Location等)或者服务(如GeoIP、IPInfoDB、百度IP地图、淘宝IP库等)来根据IP地址获取地理位置信息。当然我们根据HTTP头信息来判断的话,某些情况下,浏览器可能会在HTTP头信息中包含访问者的地理位置信息,例如X-Forwarded-For或GeoIP。你可以通过$_SERVER全局变量来获取这些信息,但请注意这些信息可能不准确,因为它们可以被客户端或代理服务器篡改。你还可以在JavaScript中获取用户的地理位置信息,然后通过Ajax发送到服务器。这需要用户的同意,并且可能受到浏览器设置和隐私策略的影响,对用户体验也不是很好。
如果我们使用百度地图的api接口,那么代码就是很简单的,获取用户的IP,然后发送给百度api接口,获取数据进行解析即可。当然也可以使用本地的IP库。那么我们经过多方考虑,还是在PHP中使用geoip扩展或者第三方服务(如MaxMind的GeoIP数据库)来识别IP地址的所在位置。本文为你介绍使用geoip扩展的实操方法。
步骤一:确保你已经安装了geoip扩展。如果没有,可以通过PECL安装:
pecl install geoip
如果你使用的是宝塔面板,可以在直接在软件商店安装!如图:
步骤二:然后在PHP代码中,你可以使用geoip_record_by_name()函数获取IP地址的位置信息:
<?php // 引入 GeoIP 库 extension_loaded('geoip') or die('Please install the GeoIP extension.'); // IP 地址 $ip_address = '192.168.0.1'; // 请替换为实际IP地址 // 使用 GeoIP 扩展获取地理位置信息 $gi = geoip_open("/path/to/GeoIP.dat", GEOIP_MEMORY_CACHE); // 请替换为GeoIP数据库的路径 $record = geoip_record_by_name($ip_address); if ($record !== false) { echo "Country: " . $record['country_name'] . "\n"; echo "City: " . $record['city'] . "\n"; echo "Latitude: " . $record['latitude'] . "\n"; echo "Longitude: " . $record['longitude'] . "\n"; } else { echo "IP address not found in database."; } // 关闭 GeoIP 数据库 geoip_close($gi); ?>
请注意,GeoIP.dat是一个二进制数据库文件,包含了IP地址到地理位置的映射。我们需要把这个数据库文件下载下来,并将其路径替换为上述代码中的path/to/GeoIP.dat。
如果你不想使用扩展或数据库,还可以使用第三方API服务,如Google的Geocoding API、淘宝IP库、百度地图api、其他IP查询服务或IPInfoDB等。在这种情况下,你需要发送HTTP请求并解析返回的JSON数据。这些服务通常需要API密钥,并且可能有使用限制。下面我们以天聚数行的api接口为例,写一个简单的测试代码:
<?php function posturl($url,$data){ $curl = curl_init(); curl_setopt($curl,CURLOPT_URL,$url); curl_setopt($curl,CURLOPT_POST,1); curl_setopt($curl,CURLOPT_POSTFIELDS,$data); curl_setopt($curl,CURLOPT_RETURNTRANSFER,1); curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false); curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,false); $output = curl_exec($curl); curl_close($curl); return $output; } $parArr = array('key' => '你的APIKEY','ip' => '183.192.70.211'); $tianapi_data = posturl('https://apis.tianapi.com/ipquery/index',$parArr); $json = json_decode($tianapi_data,true);//将json解析成数组 if($json['code'] == 200){ //判断状态码 print_r($json); //打印数组 }else{ echo '错误提示:'.$json['msg']; } ?>
注意事项:页面顶部需设置为utf8编码
header('Content-Type: text/html; charset=utf-8');
不然可能接口无法识别你发送的IP以及apikey或者你无法正确解析接口返回的数据,从而出现乱码等现象!
分享:
支付宝
微信