紧急通知:如果你的米课圈APP出现【频繁闪退】的情况,请先【卸载该版本】,并在【苹果App Store里搜索:米课圈】下载正式版即可正常使用。
写文章
料神Sam
2019-05-04 13:45
深度分析,如何禁止国内同行访问你的英文网站?
本篇优秀文章被收录在“平台引流的秘密”专题

提示:本文请阅读我博客上的版本。此文内容旧,且可能有错误。

这篇写给有实际需求的外贸人。如果你确实需要屏蔽功能,那么你可以自己动手跟着这篇教程来做,或者让外包的建站公司或建站者,按照本篇教程来做。

而没有实际需求,估计是看不下去的,什么乱七八糟的代码哈哈哈!

特点:IP屏蔽+浏览器语言识别+Cookie访问权限

如果你有个英文网站,你的主要市场是北美,那么有没有必要让其他地区的访客浪费你的服务器或主机的资源?

又比如,如果你通过谷歌GA看到的网站地访问流量和来源,很多的无效流量甚至是攻击活动,IP 来自中国,非洲,东欧等国家。

你会选择禁止他们访问吗?这是一个让人心烦的问题。

实际上,除了这些考虑因素之外,还有竞争性方面的考虑。

我的外贸课程有一定比例的学员是外贸SOHO和外贸刚起步的startup公司,刚刚开始学习并尝试自建站,总是会时不时问到:如何能屏蔽国内同行对其网站的访问?

屏蔽国内同行,目的很简单,只是为了信息保护,防止同行的跟风copy。

我的一位学员 Brian,在深圳一家做智能数码家居用品的工厂做外贸经理。他们前段时间设计出一款外形和功能都非常新颖的儿童保温杯。他们并没有没把这个新款放到阿里巴巴或其他任何B2B平台上去,也没有立即在亚马逊上铺货,就怕被同行研究模仿。他们最终只放到了英文网站上,并开始尝试做 PPC,主要是谷歌Adwords竞价广告。

Brian 也曾担心过是否会有同行有意或者无意中看到他们的英文网站,所以一度想过,是否要做一些访客流量的限制。但是由于他对网站技术一窍不通,缺乏必要的基础,最后也不知道如何去弄,最终也忽视了,没有做任何的防范措施。

谁知道,才过了一个多月后,有其他同行模仿做了类似的款式,并且放到阿里巴巴上去了。

这位 Brian 学员非常怀疑是该同行访问了他们的英文网站,抄袭了他们的设计和功能。而他还没来得及去申请专利,所以觉得特别头疼和心塞!!

最后,他来问我,是否有办法能屏蔽国内同行访问?

关于自己设计和研发的新款,被同行copy的这件事,真正的原因是否真的如他所说,因为被同行看了网站而导致的,还是另有其它什么原因,我不得而知。毕竟商场如战场,什么事都可能发生。

但是这位学员最后提问的这个问题,让我开始反思,难道不值得思考和总结一下吗?以前我曾一直认为,屏蔽国内同行IP的做法比较 low,也很难起到实质效果,因为用个代理换个国外IP就破了,因此一直不想写这种教程文章。而且我不止一次提过,只有去识别判断访问者的浏览器内置的语言编码,或者操作系统的语言,这样才是有意义的屏蔽!这样的话,同行套个国外 IP 来访问也没用。

但也只是说说思路,并没有去尝试如何实现。而这位学员的事情,让我花了几个小时写代码和测试,最终发现可以实现!

于是,趁着五一假期,补一篇这样的文章吧。关于米课圈文本编辑器不支持 html 代码,为了让它正常显示,我只能做一些小改动。你可以在米课圈PC版上看(ask.imiker.com),也可以去料网看原文。

通常屏蔽特定国家流量访问,我们常见的一些 WP 插件工具,方法主要是第一种:根据 IP地址地理位置 IP(GEO IP) 进行国家地区地判断,进行对应地屏蔽。显然,这种方式效果不太好。

而另一种方式,识别判断访问者的浏览器内置的语言编码,或者操作系统的语言,就可以差不多解决套个代理换个国外IP就可以访问的问题了。

这两种屏蔽访问的方式,即使是第一种方式(GEO IP),WordPress 插件里也很多都是付费插件才有。比如说 Wordfence,付费版才提供这个功能。而第二种按浏览器语言或操作系统语言的方式,WordPress 还没有任何相应的插件。

当然,像我这种有一定基础的业余Coder来说,不那么喜欢用插件,还是喜欢直接上代码。无论哪一种方式,要用代码实现,都不是太难。但对外贸人来说,要实现还是需要一点点基础和大胆尝试的,起码你得装个文(代)本(码)编辑器吧?记事本之类的还是算了!(常见的文本编辑器,还是推荐 notepad++ 或 sublime text3)

废话不多说,在你的网站当前所用主题的文件夹下,找到 header.php,使用文本编辑器打开。在 < head > 之前加上下面的代码,保存,上传覆盖原 header.php 文件。

注意,如果你使用的是 Avada 或 Betheme 的主题,代码放到 < head > 或 < !DOCTYPE html >的前面。下文会有截图说明。

一、利用 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

$lc = "";

$lcp = "";

// 检查是否已经设置过 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");

// 如果是中文,并且不在其他4个说中文的国家数组内,则转到百度首页。

if(($lc == "zh") && (!in_array("lg",$arr))){

header("location: https://www.baidu.com");

exit();

}

?>

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

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

注意,如果你使用的是 Avada 或 Betheme 的主题,对于这些主题在头部会输出很多html内容影响代码执行,所以请把代码放到 < head >上面一行。

如果不行,继续上移,放到< !DOCTYPE html> 的前面。

Avada主题:

Betheme主题:

以上两种方式在 chrome, firefox 以及 sougou 浏览器测试下,一切正常。

三、一些稍微高级点的用法

1)可不可以两种方式结合起来?of course,why not!? 代码都扔到 < / head> 之前即可,不过这样的话你可能用了代理也访问不了自己的网站了,呵呵。那怎么办呢?下文会介绍方法。

2)上面的两种方式,我都把屏蔽的访问转向百度了,这多少有点刻意跳转的意思,容易引人怀疑。要弄得自然点的话,你可以转向你网站下的403系统错误页,或者做个简单的HTML静态页面,提示 website under construction,然后 FTP上传到你的主机上去,然后在上面屏蔽代码中,把百度首页的网址改成此 HTML页面的网址即可。

效果演示:https://www.liaosam.com/new.html

怎么做个最简单的 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 //米课圈编辑器不支持html代码,上面几行html代码左括号后空格请自行删除

setcookie("WebsiteOwner","authorized",time()+259200000);//有效期3000天(3600x24x3000)

echo "此浏览器已成功获取免屏蔽cookie,有效期3000天!"; //显示获取cookie提示

header("Refresh:3;url=https://www.liaosam.com") //等待3秒后会自动跳转到你到网站,自己改一下你的网站首页地址

?>

< /body>

< /html>

上面这两个html标签,左括号后的空格请自行删除。

4.2)在 主题文件夹下,header.php 文件的 前,放下面的代码:

<?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 就改变成你所设置的语言版本了,即英语。

这时你就可以访问了!

最后,思维导图来总结:

原文地址

关注作者,看更多TA的好文章 个人展示
料神Sam 谁在评论里提醒下这位作者,懒得连名片都没填写。
举报
收藏
转发
0/500
添加表情
评论
评论 (68)
最近
最早

料神Sam

料神米课联合创始人,《外贸老鸟之路》作者,低调的外贸创业者。Google控,Eason门下走狗,操蛋的完美主义者。博客:liaosam.com 微信公众号:料神外贸

举报

举报原因:

垃圾广告
人身攻击
抄袭侵权
违法信息
取消 确定

圈内转发

0/104

分享至微信

复制链接

举报

请选择举报理由

留联系方式
垃圾广告
人身攻击
侵权抄袭
违法信息
举报

确认要删除自己的评论吗?

取消 确定

确认要删除自己的文章吗?

取消 确定