PHP限制特定城市禁止访问 根据IP地址获取所在地

原创 2023-03-22 本文共2314个字,预计耗時6分钟 584次阅读
文章摘要:因为网站有时候需要限制特定城市身份不让访问,就可以ii根据客户端IP地址获取所属城市进而进行限制访问。 1.技术点在于解决如何获取客户端地址,因为有可能客户端使用了代理模式,那么就需要获取真实IP地址。 2.根据IP地址使用百度开放API和...

PHP限制特定城市禁止访问 根据IP地址获取所在地

因为网站有时候需要限制特定城市身份不让访问,就可以ii根据客户端IP地址获取所属城市进而进行限制访问。

1.技术点在于解决如何获取客户端地址,因为有可能客户端使用了代理模式,那么就需要获取真实IP地址。

2.根据IP地址使用百度开放API和腾讯地图API获取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 = trim(end($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,需要去申请一个key,免费的申请地址。获取的IP信息根据结构获取IP的省份和城市信息返回即可。

https://lbs.qq.com/
function get_city() {
  $realip = get_client_ip();
  $realip = preg_replace('/:\d+/', '', $realip); //去除端口号
  $key = '你的key';
  $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);
  $response = curl_exec($curl);
  curl_close($curl);
  // 解码JSON数据为PHP数组
  $data = json_decode($response, true);  //true解析成 数据结构
  $data = $data['result']['ad_info']['province'].$data['result']['ad_info']['city'];
  return $data;
}

还有一个方式是使用百度开放API,这个不需要申请账号,直接构战URL地址就行,具体使用哪个看识别正确率吧,在我试验两个没啥区别,两者的区别在于返回的数据结构会有不一样,所以需要不同的索引值获取到城市信息

http://opendata.baidu.com/api.php?query=ip地址&co=&resource_id=6006
function 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);
   $handles = curl_exec($ch);
   curl_close($ch);
   $handles = iconv('GB2312', 'UTF-8', $handles);
   $arr = json_decode($handles, true);
   return $arr["data"][0]["location"];
}

调用获取的城市处理特定限制禁止访问

这里设置了深圳地区不让访问,使用php返回头部信息404或者其他错误信息。

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

页面URL不跳转显示错误

如果在服务器上设置了404或者于上面的对应的错误页面那么就可以实现URL地址不改变返回错误页面,下面是nginx配置404错误,一般宝塔都带有只需要把前面的#注释解除即可

#ERROR-PAGE-START  错误页配置,可以注释、删除或修改
 error_page 404 /404.html;

返回404错误页面

当然也可以弄个特定的页面,比如给个提示啥的,提示该城市禁止访问等,返回给客户端就行了。

版权免责申明
① 本站源码模板等资源SVIP用户永久不限量免费下载
② 所有资源来源于网络收集,如有侵权,请联系站长进行删除处理。
③ 分享目的仅供大家学习和交流,请不要用于商业用途,否则后果自负。
④ 如果你有源码需要出售,可以联系管理详谈。
⑤ 本站提供的源码、模板、插件等等资源,都不包含技术服务请大家谅解。
⑥ 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需。
⑦ 在您的能力范围内,为了大环境的良性发展,请尽可能的选择正版资源。
⑧ 网站资源绝不做任何二次加密或添加后门(原版加密除外)
常见问题F&Q
需要积分的资源怎么下载?
您可以注册后签到等活跃动作获得积分,积分可下载,也可充值升级等级免费下载。
源码模板等文件安全吗?有没有后门病毒吗?
站内资源标有“已测试”标签的资源源码,表示已经在本地安装测试调试过才分享出来的,可以保证一定的安全;若不放心可以自行下载模板资源后使用D盾等查杀工具扫一遍确认安全。
本站网站模板等源码提供安装服务吗?
本站资源收集于网络并分享出来共同学习,不提供免费安装服务,模板源码安装等需要有一定熟悉度,小白用户可以下载资源后雇人安装调试。