网页特效代码_站长素材站移动版

帮助中心

主页 > 帮助中心 >

如何禁止国内同行访问你的英文网站?屏蔽国外IP访问网站

  这篇写给有实际需求的外贸人。如果你确实需要屏蔽功能,那么你可以自己动手跟着这篇教程来做,或者让外包的建站公司或建站者,按照本篇教程来做。利用淘宝IP地址库进行国外IP屏蔽处理。
  而没有实际需求,估计是看不下去的,什么乱七八糟的代码哈哈哈!
 
  特点:IP屏蔽 + 浏览器语言识别 + Cookie访问权限
…… ……
  通常屏蔽特定国家流量访问,我们常见的一些 WP 插件工具,方法主要是第一种:根据 IP地址地理位置 IP(GEO IP) 进行国家地区地判断,进行对应地屏蔽。显然,这种方式效果不太好。
  而另一种方式,识别判断访问者的浏览器内置的语言编码,或者操作系统的语言,就可以差不多解决套个代理换个国外IP就可以访问的问题了。
  这两种屏蔽访问的方式,即使是第一种方式(GEO IP),WordPress 插件里也很多都是付费插件才有。比如说 Wordfence,付费版才提供这个功能。而第二种按浏览器语言或操作系统语言的方式,WordPress 还没有任何相应的插件。
  当然,像我这种有一定基础的业余Coder来说,不那么喜欢用插件,还是喜欢直接上代码。无论哪一种方式,要用代码实现,都不是太难。但对外贸人来说,要实现还是需要一点点基础和大胆尝试的,起码你得装个文(代)本(码)编辑器吧?记事本之类的还是算了!(常见的文本编辑器,还是推荐 notepad++ 或 sublime text3)
  废话不多说,在你的网站当前所用主题的文件夹下,找到 header.php,使用文本编辑器打开。在 <head>之前 加上下面的代码,保存,上传覆盖原 header.php 文件。
 
  一、利用 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();
}
?>
  如果你想对访问流量进行更细一步的分类,比如,如果你想禁止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
$url_ref = $_SERVER['HTTP_REFERER']; //访客来路地址,如果你想在判断条件里加上访客是从谷歌搜索来的,可以用上这个变量名
$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) && (strpos($url_ref, 'google') === false)){ //IP来自某1-2个国家,且来路URL里不含有google的
header("location: https://www.baidu.com");
exit();
}
?>
  不过我个人不推荐再去判断来路 URL。
  上一个代码版本,实现基本目的就够了。而判断来路URL进行过滤的这一步,如果你条件的逻辑本身不够合理,也容易让同行进入。比如,既然禁止国内同行访问,那就一律针对国内IP限制访问,管他们是从百度还是谷歌,还是直接输入网址过来的呢。
 
  二、利用访问者的浏览器语言类型进行判断并屏蔽
  关于方式二,我认为根据浏览者的浏览器语言编码来判断已经足够,所以这里不必再去研究判断访客的操作系统语言的方法了。
  每个浏览器都会有个语言编码,如中文最常见的是 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 进行判断。
 
  注意:如果你使用 Avada, Betheme 等主题,请放到 <head> 的上面。如果不行,放到 <!DOCTYPE html> 上面即可:
Avada 主题(放 <head> 上面):
如何禁止国内同行访问你的英文网站?屏蔽国外IP访问网站
如果不生效,放 <!DOCTYPE html> 的上面
如何禁止国内同行访问你的英文网站?屏蔽国外IP访问网站
同样,Betheme 主题(放 <head> 上面)
如何禁止国内同行访问你的英文网站?屏蔽国外IP访问网站
如果不生效,放 <!DOCTYPE html> 的上面
如何禁止国内同行访问你的英文网站?屏蔽国外IP访问网站
 
  以上两种方式在 chrome, firefox 以及 sougou 浏览器测试下,一切正常。
 
  三、一些稍微高级点的用法
 
  1)、可不可以两种方式结合起来?of course,why not!? 代码都扔到 <head> 之前即可,不过这样的话你可能用了代理也访问不了自己的网站了,呵呵。那怎么办呢?下文会介绍方法。
 
  2)、上面的两种方式,把屏蔽的访问转向百度了,这多少有点刻意跳转的意思,容易引人怀疑。要弄得自然点的话,你可以转向你网站下的403系统错误页,或者做个简单的HTML静态页面,提示 website under construction,然后 FTP上传到你的主机上去,然后在上面屏蔽代码中,把百度首页的网址改成此 HTML页面的网址即可。
 
  效果演示:https://www.liaosam.com/new.html
 
  怎么做个最简单的html静态页面?额,好吧,很多外贸人的确没有基础,直接给个代码吧,或者你查看上面演示页面的源代码也可以。
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <h2 style="text-align:center">Our website is under construction.</h2>
  </body>
</html>
  在 Notepad++ 中文件-新建,粘贴代码,然后另存为,选择类型:Hyper Text Markup Language File (*html, *htm, *shtml…),起名 new。
  把 new.html 文件上传到WP网站根目录下(不是WP主题根目录),然后浏览器上尝试访问 https://www.abc.com/new.html,访问OK正常的话,就可以在上面两种屏蔽模式的代码里用这个地址,替换掉百度首页地址了。
 
  3)、这种分流方式也可以用在 marketing 上,把不同地区流量的潜在客户,导到不同的 landing page 上。或者你玩多站点,你也可以设置导流。
 
  四、方式二太暴力,网站站长也无法访问了,怎么办?
 
  解决方案一、先访问一个添加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>
  4.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) – 高级 – 语言,然后把英语移到顶部。
如何禁止国内同行访问你的英文网站?屏蔽国外IP访问网站
  这样,判断条件里的 $_SERVER[‘HTTP_ACCEPT_LANGUAGE 就改变成你所设置的语言版本了。这时你就可以访问了!

  总结:
如何禁止国内同行访问你的英文网站?屏蔽国外IP访问网站
  原文转自:https://www.liaosam.com/how-to-prevent-visiting-from-your-domestic-competitors.html
(责任编辑:admin)

    468x60