Code前端首页关于Code前端联系我们

PHP开发:根据IP地址获取位置,并限制访问特定城市,

terry 2年前 (2023-09-24) 阅读数 69 #后端开发

有时网站需要限制对某些城市的访问,因此您可以根据客户端的IP地址请求城市,然后限制访问。

1。技术点是解决如何获取客户端地址,因为可能客户端使用的是代理模式,所以需要获取真实的IP地址。

2。使用百度开放API和腾讯地图API根据IP地址检索IP所在城市并限制访问。

具体实现方法:

获取真实IP地址

主要是判断三个值,只要有

function get_client_ip() { $ip_address = ''; if (isset ($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty ($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip_list =explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); $ip_address = 修剪(结束($ip_list)); } else if (isset ($_SERVER['HTTP_CLIENT_IP']) && !empty ($_SERVER['HTTP_CLIENT_IP'])) { $ip_address = $_SERVER['HTTP_CLIENT_IP']; } else if (isset ($_SERVER['REMOTE_ADDR']) && !empty ($_SERVER['REMOTE_ADDR'])) { $ip_address = $_SERVER['REMOTE_ADDR']; } return $ip_address;}

根据IP地址获取城市区域

如果客户端使用代理反射进行代理,IP地址可能带有端口号,所以必须去掉端口号。

以下是API腾讯地图。您需要申请免费的应用程序密钥和地址。可以根据从IP获取的省市信息的结构来返回获取的IP信息。

https://lbs.qq.com/

函数 get_city() { $realip = get_client_ip(); $realip = preg_replace('/:\d+/', '', $realip); // 删除端口号 $key = 'yourkey'; $url = "https://apis.map.qq.com/ws/location/v1/ip?ip = ".$realip."&key = ".$key; // 使用curl $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $响应=curl_exec($curl);卷曲_关闭($卷曲); // 将 JSON 数据解码为 PHP 数组 $data = json_decode($response, true); //true被解析成数据结构 $data = $data['hasil']['ad_info']['provinsi'].$data['hasil']['ad_info']['city']; return $data ;}

另一种方法是使用百度开放API。这个不需要申请账号,直接建一个URL地址就可以了。使用哪一种取决于识别的准确性。我两者都尝试一下并不重要。两者的区别在于返回的数据结构会不同,因此需要不同的索引值来获取城市信息。

http://opendata.baidu.com/api.php?query=ip地址&co=&resource_id=6006

函数 get_city(){$realip = get_client_ip(); $realip = preg_replace('/:\d+/', '', $realip); // 去掉端口号 $api = "http://opendata.baidu.com /api.php?query=" .$realip. "&co=&resource_id=6006"; $ch=curl_init(); curl_setopt($ch, CURLOPT_URL, $api); curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3); $句柄=curl_exec($ch);卷曲_关闭($ch); $handles = iconv('GB2312', 'UTF-8', $handle); $arr = json_decode($handles, true); return $arr["data"][0]["location"];}

获取城市调用,处理具体限制并禁止访问

此处设置深圳,如果该地区不允许访问,则使用PHP返回 404 标头信息或其他错误消息。

$local = get_city(); if (strpos ($local,"深圳") !==false) { header('HTTP/1.1 404 未找到'); exit();}

显示错误的间接页面URL

如果服务器上或上面相应的错误页面设置了404,那么URL地址可以不改变地返回到错误页面。下面是nginx配置错误404。一般宝塔都有。只需更改前面的#ERROR-PAGE-START错误页面配置取消注释即可,可以注释、删除或修改error_page 404 /404.html;PHP开发:根据IP地址获取所在地,限制特定城市禁止访问

当然,你也可以创建一个特定的页面,比如指路什么的,去掉禁止访问的城市等等,直接返回给客户端即可。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门