博主最近想把服务器迁移到国内,自然就免不了要备案了。那么遇到一个头疼的问题,就是备案期间,管局要求网站不能访问。一般来说,备案的周期还是挺长的,关闭这么长时间还是对网站有不小的影响的。
那么有没有什么方法能够在备案期间不关闭网站,把影响降低到最小呢?答案是肯定的,继续往下看。
通常来说,备案主要涉及两个方面的审核,第一个是云服务器厂商的初审,第二个则是管局的审核。那么我想到的解决办法就是,只屏蔽这两个地区的ip即可。这样可以把影响降低到最小。那么接下来看如何实现屏蔽某个特定地区的ip(可精确到市级)。
废话不多说,直接上代码
<?php
function get_client_ip() {
$ip = $_SERVER['REMOTE_ADDR'];
if (isset($_SERVER['HTTP_X_REAL_FORWARDED_FOR']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_X_REAL_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_REAL_FORWARDED_FOR'];
} elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} elseif (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
}
return $ip;
}
$ip = get_client_ip(); //获取访客IP
$antecedents = $_SERVER['HTTP_REFERER']; //访客来路地址
$verification1 = '江西省'; //需要屏蔽IP的省份
$result1 = file_get_contents("http://ip-api.com/json/".$ip."?lang=zh-CN"); //IP数据库来自ip-api.com。
$address1 = json_decode($result1, true);
// echo("<script>console.log('".$address1['regionName']."');</script>");
$verification2 = '江西'; //需要屏蔽IP的省份
$result2 = file_get_contents("http://freeapi.ipip.net/".$ip); //IP数据库来自ipip.net。
$address2 = json_decode($result2, true);
// echo("<script>console.log('".$address2[1]."');</script>");
// 判断访客IP是否属于江西省,是否来自百度,是否来自谷歌
if (($address1['regionName'] == $verification1 || $address2[1] == $verification2) && strpos($antecedents, 'baidu') === false && strpos($antecedents, 'google') === false) {
sleep(99999999); // 设置一个999999秒的等待。
Header("HTTP/1.1 204 No Content");
exit;
}
?>
上面的代码是先获取用户的ip地址,然后利用ip地址库查询对应ip的国家,省份,城市等信息。ip-api.com的结果不是特别准确,所以又加上了ipip.net的免费api(还是比较准确的,就是免费api只有3个信息)。对api感兴趣的小伙伴可以直接去官网查看api使用说明。
将以上代码放在首页index.php的开头即可,然后对应地区就打不开首页了。