一、利用 IP 地址进行判断并屏蔽

假设你要屏蔽国内同行的 IP 访问(同样地,你自己也只能代理方式访问了)。首先你必须有个判断 GEO IP 的模块。在 VPS 上你可以在 nginx 上安装 geo ip 模块,但是安装和使用上还是麻烦了点。并且,如果你用的是虚拟主机,那就无法自己随心所欲安装扩展模块了。

所以,我们可以借用第三方 IP库的 API 接口。比如淘宝的 IP 库,IP138 的 IP 库等等,判断都非常准确。具体代码:

复制代码
<?php
$verification1 = '中国'; //需要屏蔽国家名称1
$verification2 = '摩洛哥'; //需要屏蔽的国家名称2。这里可以类似的方式,定义多个国家。
function get_visitor_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_visitor_ip();  //获取访客IP
$result = file_get_contents("http://ip.taobao.com/service/getIpInfo.php?ip=".$ip);  //IP数据库来自淘宝。你也可以换成 IP138 的。建议默认。
$address = json_decode($result,true);
//判断访客的IP是否来自国家1或国家2
if($address['data']['country'] == $verification1 || $address['data']['country'] == $verification2){ //如果只需要屏蔽国家名称1,这里无需修改,把开头的国家名称2'摩洛哥'改成某个不存在的名称即可,如'冥王星'。
header("location: https://www.baidu.com");
exit();
}
?>
复制代码

二、利用访问者的浏览器语言类型进行判断并屏蔽

关于方式二,我认为根据浏览者的浏览器语言编码来判断已经足够,所以这里不必再去研究判断访客的操作系统语言的方法了。

每个浏览器都会有个语言编码,如中文最常见的是 zh 或 zh-CN。

利用访问者的浏览器语言类型进行判断并屏蔽:

复制代码
<?php
// 定义变量 lc
$lc = ""; 
// 检查是否已经设置过 HTTP头Accept-Language信息变量
if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))
$lc = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
// 这里截取语言编码前两位来判断,如果是中文,转向百度
if($lc == "zh"){
header("location: https://www.baidu.com"); 
exit();
}
?>
复制代码

 

但是,语言编码前2位是 zh 的包含多个国家或地区,比如新加坡、澳门、香港、台湾。

zh中文zh-CN中文(简体)zh-HK中文(香港)zh-MO中文(澳门)zh-SG中文(新加坡)zh-TW中文(繁体)

所以如果你要排除这些情况,可以再做一个 if 判断。稍作修改:

复制代码
<?php
$lc = '';
if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])){
$lg = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$lc = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
}
$arr = array('zh-HK','zh-TW','zh-MO','zh-SG');
if(($lc == 'zh') && (!in_array('lg',$arr))){
header('location: https://www.baidu.com'); 
exit();
}
?>
复制代码

 

OK,搞定!这样就不会“误伤”其他中文语言的地区或国家的访问流量了。

当然,如果你想对访问流量进行更细一步的分类,那么还可以像第一种方式代码里调用 $_SERVER[‘HTTP_REFERER’] 的变量,对来路的 URL 进行判断。

方式二太暴力,网站站长也无法访问了,怎么办?

解决方案一、先访问一个添加 Cookie 的页面,再验证 cookie 的值,不符合条件的,屏蔽。符合 Cookie 的,通行。

站长在访问网站前,先访问一个任何人都不知道的页面,获取浏览器特定的cookie,相当于获取通行证。

4.1)在网站 根目录下,放一个 php 文件。

取名 getcookie.php,或 letmein.php,或任何你觉得好记的名字。为了安全起见,你最好自己取个名字,不要用我示范的文件名。

代码如下:

复制代码
<html>
<head>
<title></title>
</head>
<body>
<?php 
setcookie("WebsiteOwner","authorized",time()+259200000);//有效期3000天(3600x24x3000)
echo "此浏览器已成功获取免屏蔽cookie,有效期3000天!"; //显示获取cookie提示
header("Refresh:3;url=https://www.liaosam.com") //等待3秒后会自动跳转到你到网站,自己改一下你的网站首页地址
?>
</body>
</html>
复制代码

2)在 主题文件夹下,header.php 文件的 <head> 前放下面的代码

(注意:如果你使用 Avada, Betheme 等主题,如果放 <head> 上面不行,放到 <!DOCTYPE html> 上面即可)

复制代码
<?php
// 定义变量 lc
$lc = "";
// 检查是否已经设置过 HTTP头Accept-Language信息变量
// 截取语言编码前两位来判断
if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))
$lg = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$lc = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
$arr = array("zh-HK","zh-TW","zh-MO","zh-SG");

$ck = $_COOKIE["WebsiteOwner"];
// 如果是中文,并且不在其他4个说中文的国家地区内,并且cookie的值不等于预设的值,则转到网站建设页

if(($lc == "zh") && (!in_array("lg",$arr)) && ($ck !== "authorized") ){
header("location: https://www.liaosam.com/new.html"); 
exit();
}
?>
复制代码

 

注意:两部分代码的对应关系我用红色字体标注好了。关于这个cookie值 authorized,你也可以改成别的。如 yes, noproblem, iamgood666 等等。

一般同行来访问,没有正确的cookie值,是进不去的。而你要进去,先访问你网站根目录下的 getcookie.php 或 letmein.php 文件即可。

访问地址:https://www.yourdomain.com/getcookie.php
前面提醒过了,你最好取一个不一样的 php文件名,这个网站根目录下的文件地址只有你知道。访问它,从它那里获取 cookie,然后再跳转或者你手动访问网站,就OK了!

这就解决了方式二的浏览器语言编码通杀的问题。

解决方案二:在 Chrome 设置里修改浏览器内置语言

加了方式二的代码,站长也打不开了。怎么办?打开 Chrome 浏览器的设置,点击菜单 – 设置(Settings) – 高级 – 语言,然后把英语移到顶部。

这样,判断条件里的 $_SERVER[‘HTTP_ACCEPT_LANGUAGE 就改变成你所设置的语言版本了。这时你就可以访问了