WordPress阻止某地IP访问功能函数
网站如果只为某地服务或是不让某地服务,自建IP库又麻烦,可以使用百度IP库,获取IP后得到归属地进行放行或阻止操作。
http://opendata.baidu.com/api.php?query=117.136.12.79&co=&resource_id=6006&oe=utf8
以上是访问接口的地址,以下是返回的信息。
{"status":"0","t":"","set_cache_time":"","data":[{"ExtendedLocation":"","OriginQuery":"117.136.12.79","SchemaVer":"","appinfo":"","disp_type":0,"fetchkey":"117.136.12.79","location":"广东省广州市 移动","origip":"117.136.12.79","origipquery":"117.136.12.79","resourceid":"6006","role_id":0,"schemaID":"","shareImage":1,"showLikeShare":1,"showlamp":"1","strategyData":{},"titlecont":"IP地址查询","tplt":"ip"}]}
个人AK码申请地址在这里:https://lbs.baidu.com/apiconsole/key
申请的访问应用(AK)使用量,个人博客网站应该是够用的。详细功能代码如下:
function banyouip(){
// 1. 设置时区(补单引号)
date_default_timezone_set('PRC');
// 2. 获取真实IP(优化顺序 + 防伪造 + 清洗)
$ip = $_SERVER['REMOTE_ADDR'];
// 不建议优先使用 HTTP_CLIENT_IP / X_FORWARDED_FOR,极易伪造
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$forward_ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$ip = trim($forward_ips[0]); // 去除首尾空格
}
// 简单IP格式校验
if (!filter_var($ip, FILTER_VALIDATE_IP)) {
return;
}
// 3. 拼接API地址(双引号支持变量插值,补全引号)
$ak = 'HfiaKSezCc9N60uvChgT80WO4d5P4wun1';
$api_url = "https://api.map.baidu.com/location/ip?ak={$ak}&ip={$ip}";
// 4. 请求百度IP定位接口
$response = wp_remote_get($api_url, [
'timeout' => 5, // 超时时间,防止卡死
]);
// 请求失败直接返回
if (is_wp_error($response)) {
return;
}
$content = wp_remote_retrieve_body($response);
$json = json_decode($content, true);
// JSON解析失败 / 接口返回异常
if (json_last_error() !== JSON_ERROR_NONE || empty($json) || $json['status'] !== 0) {
return;
}
// 5. 设置响应头(补引号)
header('Content-Type: application/json; charset=UTF-8');
$address = $json['content']['address'] ?? '';
// 封禁 贵州省 来访
if (strpos($address, '贵州省') !== false) {
wp_die(
'本站已禁止贵州IP来访,<br>但这或许并不是一扇紧闭的大门,想想办法~',
'感谢来访-Xie Blog',
['back_link' => true]
);
}
}
//调用函数(WordPress 前台访问时执行)
add_action('template_redirect', 'banyouip',15);