网站防镜像以及解决七牛静态页面跳转的js方案

沃森博客 2017年9月17日22:59:35服务器评论315阅读模式

作为站长,基本都遇到过网站被人镜像的烦恼吧?最典型的代表就是谷歌搜索,大家都懂的。很多时候反代我们网站的人可能就是拿你的网站练下手,学习下反向代理。当遇到网站被反代,而且排名还比你好的时候,有没有要暴走的冲动...本文分享一种简单有效网站防镜像的方案,适合任何html页面。

①、WordPress专用版(本博使用的方法)

借助了img的onerror事件来实现。

将下方代码添加到当前主题functions.php文件当中即可。其他类似js可以不用上了,不过也不会冲突。

  1. add_action('wp_footer','deny_mirrored_websites');
  2. function?deny_mirrored_websites(){
  3. ????$currentDomain?=?'wosn."?+?"net';?//此处自行拆分一下自己的域名即可
  4. ????echo?'<img?style="display:none"?src="?"?onerror=\'var?str1="'.$currentDomain.'";str2="docu"+"ment.loca"+"tion.host";str3=eval(str2);if(?str1!=str3?){?do_action?=?"loca"?+?"tion."?+?"href?=?loca"?+?"tion.href"?+?".rep"?+?"lace(docu"?+"ment"+".loca"+"tion.ho"+"st,"?+?"\"'?.?$currentDomain?.'\""?+?")";eval(do_action)?}\'?/>';
  5. }

②、HTML通用版

既然是js代码,那么肯定可以用于任何符合html规范的页面了。要不是为了可以放到wp的functions.php,都没必要写成php的模式,直接用html代码即可:

  1. <img?style="display:none"?src="?"?onerror='var?currentDomain="wosn."?+?"net";?var?str1=currentDomain;?str2="docu"+"ment.loca"+"tion.host";?str3=eval(str2)?;if(?str1!=str3?){?do_action?=?"loca"?+?"tion."?+?"href?=?loca"?+?"tion.href"?+?".rep"?+?"lace(docu"?+"ment"+".loca"+"tion.ho"+"st,"?+?"currentDomain"?+?")";eval(do_action)?}'?/>

将以上代码中的

  1. var?currentDomain="wosn."?+?"net";

自行拆分成自己的域名,避免被镜像代码替换掉,比如:

  1. var?currentDomain="www."?+?"baidu"?+?".com";

然后将代码添加到网站的之后即可(不建议放置到里面,具体原因上文已说明),WP一般为header.php文件,其他建站程序请自行搞定,这个版本适合任何网页。

Ps:本来是丢到wp_head的,经过测试发现图片放到head,浏览器会自动进行错误调整,导致一些本来在head的元素被丢到了body当中,比如style.css,估计网页标准中head里面就不应该放置图片,所以移到了footer当中。

弊端

JS版本效果确实可以,但是有一个小弊端,大部分搜索引擎不能识别js,所以蜘蛛还是能正常抓取镜像网站,有可能会影响SEO。(七牛云可以设置robots文件来禁止抓取。)

要彻底解决镜像站问题,就得直接禁止镜像网站服务器抓取我们的网页。

③、通过UA禁止

JS版本效果确实可以,但是有一个小弊端,大部分搜索引擎不能识别js,所以蜘蛛还是能正常抓取镜像网站,有可能会影响SEO。要彻底解决镜像站问题,就得直接禁止镜像网站服务器抓取我们的网页。

有网站已经分享了通过获取镜像网站的服务器IP来禁止抓取,但是镜像网站换一个IP,或者还有其他镜像网站,都无法一劳永逸。所以,我们可以研究镜像服务器抓取时的特征,然后通过禁止特征来解决镜像问题,当然这个方法也不能绝对,因为特征很多时候都是可以伪造的,这里就不多说了。

其实这种镜像站和采集基本类似,所以我们需要先分析某一类镜像站的UA特征是什么。

对几个镜像站进行了分析,其实就是在访问镜像网页的时候去查看我们的网站日志,我发现全部请求UA都是PHP/5.4.4:

  1. 211.104.158.56?-?-?[22/Aug/2016:22:03:11?+0800]?"GET?/?HTTP/1.1"?200?64410?"-"?"PHP/5.4.45"?211.104.158.56?http

既然知道他们的UA了,那么就很好解决了。直接将 PHP这个关键词加入UA禁止清单中即可!

PHP通用版:

  1. //禁止UA为空或含有PHP的请求
  2. $ua?=?$_SERVER['HTTP_USER_AGENT'];
  3. if(!$ua?||?preg_match('/PHP/i',?$ua))?{
  4. ????header("Content-type:?text/html;?charset=utf-8");
  5. ????die('请勿采集本站,因为采集的站长木有小JJ!');
  6. }

将以上代码加入到PHP网站根目录的index.php的的<?php 之后即可。

WP适用版:

如果使用上面的php版本,WordPress每次更新就会需要操作index.php,比较麻烦,因此弄个专版:

  1. if(!is_admin())?{
  2. ????add_action('init',?'deny_mirrored_request',?0);
  3. }
  4. function?deny_mirrored_request()
  5. {
  6. ????$ua?=?$_SERVER['HTTP_USER_AGENT'];
  7. ????if(!$ua?||?preg_match('/PHP/i',?$ua))?{
  8. ????????header("Content-type:?text/html;?charset=utf-8");
  9. ????????wp_die('请勿采集本站,因为采集的站长木有小JJ!');
  10. ????}
  11. }

将以上代码添加到WordPress主题的functions.php中即可。

Nginx版本:

  1. if?($http_user_agent?~*?"PHP")?{
  2. ?????return?403;
  3. }

将以上规则加入到nginx的vhost当中,比如添加到第一个location 之前,然后重载Nginx即可。

用此方法的同学可要注意不要照搬上方代码,需知道UA特征。

我看到有同学使用了htaccess来判断UA,但最后却返回了一个301跳转到首页,也可以只是有时候镜像程序也是可以抓取301的目标内容的,至少我之前就写过支持301跳转的php代码。

好了,关于镜像网站的问题就整理分享这么多,大家自行选择适合自己的方案即可!

另外,如果是使用https的网站,想将 http 的访问都跳转到 https 又不想弄个301跳转(可能影响SEO),那么上述js代码稍微改改就能完美跳转了:

  1. <script?type="text/javascript">
  2. /*?如果当前是http访问,那么跳转到对于的https页面?*/
  3. if?(document.location.protocol?!=?"https:")?{
  4. ????location.href?=?location.href.replace(/^http:/,"https:");
  5. }
  6. </script>

七牛镜像

用了七牛的网站,可以试试直接访问我们自定义的七牛静态域名,是不是和我们现在的网站一模一样呢?只是它不会更新而已。很多人肯定下意识的试过沃森博客,发现居然会跳转到对应的博客页面!

比如访问:http://cdn.wosn.net/604.html会跳转到 http://wosn.net/604.html

于是,有不少朋友留言问我,怎么实现301跳转的??

好吧,除非七牛帮忙在CDN节点做设置,将非静态资源请求都跳转到源站,否则张戈也是没办法做301跳转的。因此,你看到的跳转也不是301了,而是js的跳转!

实现原理就是上文介绍的js方案咯!七牛就类似于一个镜像站,而且是静态存储到了七牛节点,因此只能用js方案,在静态页面中实现判断和跳转。

所以,上文分享的js防镜像代码,同样适用于七牛静态页面的自动跳转。只是美中不足的是,大部分搜索引擎并不能识别这个跳转,为了SEO,那你还得继续使用七牛的robots设置了。

最新补充:有人留言说了更好的方案,在Nginx中判断七牛的UA以及抓取的路径就能杜绝七牛缓存不改缓存的页面,要实现也很简单,在Nginx配置中加入如下规则即可:

  1. #匹配请求UA是不是七牛
  2. if?(?$http_user_agent?~*?'qiniu-imgstg-spider'){
  3. ????set?$deny_qn?'y';
  4. }
  5. #匹配请求页面是不是hml或php结尾
  6. if?(?$request_uri?~*?'\.(html|php)$'?)?{
  7. ???set?$deny_qn?'${deny_qn}es';
  8. }
  9. #匹配首页
  10. if?(?$request_uri?~?'^/$'?)?{
  11. ???set?$deny_qn?'${deny_qn}es';
  12. }
  13. #若上述2个条件成立,就拒绝访问
  14. if?(?$deny_qn?=?'yes'?)?{
  15. ???return?403;
  16. }

沃森博客
  • 本文由 发表于 2017年9月17日22:59:35
  • 本文来自互利网收集整理,问题反馈联系邮箱:wosnnet@foxmail.com,转载请务必保留本文链接:https://wosn.net/604.html

发表评论