网站建设

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

导读:作为站长,基本都遇到过网站被人镜像的烦恼吧?最典型的代表就是谷歌搜索,大家都懂的。很多时候反代我们网站的人可能就是拿你的网站练下手,学习下反向代理。当遇到网站被反代,而且排名还比你好的时候,有没有要暴走的冲动...本文分享一种简单有效网站防镜像的方案,适合任何html页面。 一、前人分享 挺早之前,看到boke112转载过一篇网站防镜像教程,分享了从.htaccess、php以及js三个方向禁止他人恶意反向代理我们的网站。当时看完觉得三个方法都不完善: 先分析下原理: .htaccess方案是禁止从代理IP过来的请求 js方案如果发现浏览器url地址不是预期的,那么直接跳转到我们规定的域名。 php方案的原理和js方案类似,通过 $_SERVER 变量判断域名判断请求是否符合预期,不是就跳转走。 再分析下缺憾: .htaccess方案,只要请求中含有代理IP(HTTP_X_FORWARDED_FOR不为空)就禁止访问,那如果用CDN的就全部GG了,而且这个值是可以在做反向代理的时候置空的,比如Nginx中可以这样做: php方案中,$_SERVER的值同样可以在反向代理时伪造,比如: 二、优化版本 已推出最终版,所以,此优化版本可以不用了 js方案,这个也是我今天要分享的方案,之前在boke112我也留言分享了张戈博客的做法,不过好像留言被删除了。文章中的js方案可是可以,但是是写死的跳转。也就是说不管在哪个页面,最终跳转都是首页!显然,这个方案还不够精细化,我们可以做得更细致! 所以,网站防镜像最简单有效的做法就是在<head>部分插入如下js代码即可: 这里对文章js方案做了更细致的改善,也就是跳转之前想将当前url做一次替换,把当前url中的域名换成我们规定的域名,确保跳转后就是用户想要的页面,而不是强硬的跳到首页! js方案相对于其他方案来说,它的优势在于无法在反代时伪造,浏览器反馈的就是真实的访问情况,直接粗暴。当然,用 Nginx 的第三方内容过滤模块 ngx_http_subs_filter_module 也可以对反代的页面内容进行过滤,当然这是更高级的手法了,这里就不深入介绍了(请注意这段话,本文分享的只是一个方案,并非绝对有效的方法!!)。 三、最终版本 ①、WordPress专用版 龙笑天下很好的整理总结了目前几种防镜像的js方案,我看到最后一个借助了img的onerror事件,想法不错,就重新写了一个更简洁,兼容性更好的代码: 将此代码添加到主题functions.php文件当中即可。其他类似js可以不用上了,不过也不会冲突。 Ps:本来是丢到wp_head的,经过测试发现图片放到head,浏览器会自动进行错误调整,导致一些本来在head的元素被丢到了body当中,比如style.css,估计网页标准中head里面就不应该放置图片,所以移到了footer当中。 2017年10月21日补充:这段代码会因为onerror死循环造成浏览网页的电脑高负载(CPU飙升),因此在代码onerror触发事件中加入onerror清空机制,即加入this.onerror=null【相关文章】。 ②、HTML通用版 既然是js代码,那么肯定可以用于任何符合html规范的页面了。要不是为了可以放到wp的functions.php,都没必要写成php的模式,直接用html代码即可: 将以上代码中的 自行拆分成自己的域名,避免被镜像代码替换掉,比如: 然后将代码添加到网站的<body>之后即可(不建议放置到<head>里面,具体原因上文已说明),WP一般为header.php文件,其他建站程序请自行搞定,这个版本适合任何网页。 ③、通过UA禁止 JS版本效果确实可以,但是有一个小弊端,大部分搜索引擎不能识别js,所以蜘蛛还是能正常抓取镜像网站,有可能会影响SEO。要彻底解决镜像站问题,就得直接禁止镜像网站服务器抓取我们的网页。 有网站已经分享了通过获取镜像网站的服务器IP来禁止抓取,但是镜像网站换一个IP,或者还有其他镜像网站,都无法一劳永逸。所以,我们可以研究镜像服务器抓取时的特征,然后通过禁止特征来解决镜像问题,当然这个方法也不能绝对,因为特征很多时候都是可以伪造的,这里就不多说了。 14年张戈博客就就已经整理分享过网站反爬虫攻略:《服务器反爬虫攻略:Apache/Nginx/PHP禁止某些User Agent抓取网站》,其实这种镜像站和采集基本类似,所以我们需要先分析某一类镜像站的UA特征是什么。 抽空对此次站长朋友纷纷“讨伐”的几个镜像站进行了分析,其实就是在访问镜像网页的时候去查看我们的网站日志,我发现全部请求UA都是PHP/5.4.4: 想来也就明白了,这些镜像站点基本都是用的一套程序,甚至环境都是一致的!这让人很容易联想是不是一个人在搞事。。。 好了,废话不多说,既然知道他们的UA了,那么就很好解决了。直接将 PHP这个关键词加入到《服务器反爬虫攻略:Apache/Nginx/PHP禁止某些User Agent抓取网站》 这篇文章的UA清单中即可! 这里,只简单分享一下PHP代码和Nginx代码,其他的请参考前文。 PHP通用版: 将以上代码加入到PHP网站根目录的index.php的<?php 之后即可。 WP适用版: 如果使用上面的php版本,WordPress每次更新就会需要操作index.php,比较麻烦,因此弄个专版: 将以上代码添加到WordPress主题的functions.php中即可。 Nginx版本: 将以上规则加入到nginx的vhost当中,比如添加到第一个location 之前,然后重载Nginx即可。 我看到有同学使用了htaccess来判断UA,但最后却返回了一个301跳转到首页,虽然也可以,但是有时候镜像程序也是可以抓取301的目标内容的,至少我之前就写过支持301跳转的php代码。 好了,关于镜像网站的问题就整理分享这么多,大家自行选择适合自己的方案即可! 四、拓展延伸 另外,如果是使用https的网站,想将 http 的访问都跳转到 https 又不想弄个301跳转(可能影响SEO),那么上述js代码稍微改改就能完美跳转了: 看到这,你应该体会到了js的妙用吧?后续应该可以举一反三,多多利用了! 五、七牛镜像 用了七牛的网站,可以试试直接访问我们自定义的七牛静态域名,是不是和我们现在的网站一模一样呢?只是它不会更新而已。很多人肯定下意识的试过张戈博客,发现居然会跳转到对应的博客页面! 比如访问:http://static.zhang.ge/5100.html 会跳转到 https://zhang.ge/5100.html 于是,有不少朋友留言问我,怎么实现301跳转的?? 好吧,除非七牛帮忙在CDN节点做设置,将非静态资源请求都跳转到源站,否则张戈也是没办法做301跳转的。因此,你看到的跳转也不是301了,而是js的跳转! 实现原理就是上文介绍的js方案咯!七牛就类似于一个镜像站,而且是静态存储到了七牛节点,因此只能用js方案,在静态页面中实现判断和跳转。 所以,上文分享的js防镜像代码,同样适用于七牛静态页面的自动跳转。只是美中不足的是,大部分搜索引擎并不能识别这个跳转,为了SEO,那你还得继续使用七牛的robots设置了。 当然,如果你添加js代码之前就已经在使用七牛了,那么必须清空七牛中的缓存文件才行,否则是不会跳转的了!因为缓存的代码中没有这段js咯! 最新补充:有人留言说了更好的方案,在Nginx中判断七牛的UA以及抓取的路径就能杜绝七牛缓存不改缓存的页面,要实现也很简单,在Nginx配置中加入如下规则即可: 最后,再啰嗦一句,本文分享的只是小白入门级方案,喜欢喷的朋友建议早点Alt +F4,张戈谢谢你。
阅读全文
网站建设

分享最近对网站外链跳转页面代码的一些改善

很久之前在博客分享了几篇关于外链跳转的代码或教程。如果没看过的可以先了解下: 分享两种外链跳转方法,可避免权重流失。 分享一个WordPress外链跳转教程,兼容知更鸟暗箱下载和文章索引 分享知更鸟Begin主题外链跳转代码,兼容下载按钮和弹出层上的外链 最近,有了一些灵感以及在其他博客也吸收了一些相关经验,就把现用的外链代码小改了下,感觉还不错,现在分享下,喜欢的可以试试。 Ps:不喜欢啰嗦的朋友请直接从第五步开始看。 一、安全加固 首先,加入了在鱼叔博客看到了的防止恶意请求的简单防护代码: 二、跳转方式 之前的代码使用的是html的refresh跳转方式: 正好之前分享百度是如何取消关键词的时候,curl到的是这样的一个结果: 百度使用了一个跳转方式,成功伪造了新的referrer来路,从而屏蔽了搜索关键词。 很明显上面的代码使用了html的refresh和JS两种跳转模式,而html的用到了noscript标签,也就是说当浏览器不支持js的时候才会使用html跳转的方式。 所以,我之前分享的跳转代码也可以参考改进下: 三、跳转加密 看过有博客对外链进行了一个Base64加密,所以我也加入了这次小改当中,而且还可以同时兼容不加密的跳转链接: 四、禁止收录 既然是外链跳转,肯定不希望被蜘蛛收录或抓取,所以多加入了一个禁止收录和抓取的META申明: 五、正式部署 ①、完整跳转代码 I、PHP版本 将以上代码保存为go.php上传到网站根目录即可。 II、JS版本 这算是这次的彩蛋吧!偶然的灵感,让我想到了其实可以用 js+html 纯静态来搞定这个跳转功能。测了又测,终于新鲜出炉!和PHP基本一致的功能,可以放心使用! 选择JS 版本将以上代码保存为 go.html 上传到网站根目录即可。 Ps:2个版本的功能是一致的,优缺点区别:PHP版本是动态的,会略微产生服务器的性能负载,而JS版本则需要浏览器支持JS才可以功能。不过目前来看,绝大部分浏览器都是支持的! ②、Nginx伪静态 之前的代码用的都是 “go.php?url=外链地址” 的形式,经常也看到有个别网站对外链跳转做了伪静态,也就是 “/go/外链” 这种形式。 这次,也试了下,感觉还不错,所以就整了下。只要在Nginx中加入如下规则即可: I、PHP版本 II、JS 版本 张戈博客 TIPS 实际上,将php版本保存为 index.php 或 将JS版本保存为 index.html,然后在网站根目录新建一个go文件夹,把 index.php 或 index.html 上传到go文件夹中,那么Nginx就可以使用一条通用规则了: 说白了,因为 index.php 或 index.html 是WEB读取的默认文件,其中 index.html 一般优先级比 index.php更高一些,所以只需要重写到go目录即可,至于你选择js版本还是php版本就看你index放的是php还是html了。 此段文字看不懂的话,请忽略之。 Ps:上述代码如果不知道放到哪,可以直接放在 location / { 的前面即可。加入伪静态规则,并且重启Nginx之后,我们就可以通过 "/go/外链加密串" 的方式进行跳转了。不过亲测发现无法使用 /go/https://zhang.ge/xxx 这样直接丢http地址的方式进行跳转,因为http://会读取为 http:/,少了一个斜杠,这个之前博客文章其实有提到过,这里就不深究了。 ③、Apache伪静态 还是有不少网站用的是Apache服务器,所以还是补充一下Aapace伪静态规则: 将上述规则代码添加到 .htaccess 文件的第一行即可。 ④、WordPress替换 做好了跳转页面,我们就需要将之前应用的相关函数都修改一下。其实就是将代码中的 /go/?url=外链 改成 /go/base64加密串 的模式,下面贴一下具体代码,请自行参考修改。 Ps:由于张戈博客需要兼容之前的 /go/?url= 的形式,所以现在用的是/goto/伪静态形式,无此需求的网站可忽略之。 A. 文章外链替换 B. 评论外链跳转 C.  下载外链跳转 用过之前外链跳转的网站,应该都有上述ABC代码,只要参考上述代码,修改一下替换后的链接形式即可。部署后,刷新前台文章或评论,就能看到效果了。 看了还是不太会的朋友,建议多看、多想、多动手、多搜索、少提问,这是网站折腾学习的不二法门!
阅读全文
网站建设

分享知更鸟Begin主题外链跳转代码,兼容下载按钮和弹出层上的外链

今天 osx86 问我,说网上找的代码用到begin主题上,会导致下载按钮(href=#button)也被替换,导致无法弹出下载界面。其实张戈博客之前分享过一个博客外链转内链的跳转到代码,可以兼容 HotNewspro主题的下载按钮和文章索引,于是我要他站内搜索下。 他用了后发现确实可以,不过给我反馈了一个问题:确实滤过了下载按钮和索引,但是弹出层上的下载链接没有被替换成跳转链。 我随即看了下,发现确实是这样。因为代码是在文章content过滤的,而下载按钮是独立的模板,所以并不会生效。 唉,世上无难事,依葫芦画瓢是也! 方法很简单,找到下载按钮相关模板文件,然后替换不就得了吗?且往下看。 一、新增函数 将如下 php 代码添加到 主题目录下的 functions.php 文件中: 这个函数使用很简单,直接传入链接,函数会自动判断,并绝对会返回一个内链,比如: <?php echo link_nofollow("http://www.baidu.com");?> 就会输出: https://zhang.ge/go/?url=http://www.baidu.com 需要配合张戈博客之前分享的跳转代码,详见 https://zhang.ge/2703.html。 二、修改模板 已经有了替换函数了,下一步就是找到你要替换的地方,将原先的值传入函数即可。Begin 的下载弹出层代码位于 begin/inc/file.php 原始代码如下: 其中的 url1-4 就是我们要处理的目标,所以如下修改即可: 保存后,文章下载弹出层里面的外链就变成了内链跳转的模式了。 代码和方法都非常简单,有需要的自己折腾吧!不清楚的可以参考一下之前分享2篇文章: 分享两种外链跳转方法,可避免权重流失 分享一个WordPress外链跳转教程,兼容知更鸟暗箱下载和文章索引
阅读全文
网站建设

分享一个WordPress外链跳转教程,兼容知更鸟暗箱下载和文章索引

张戈博客很久很久之前转载过一篇关于博客外链跳转的方法(相关文章),后来安装了Anylink插件也就没有用到。近来清点插件时,我将Anylnk给淘汰了,换成了网上找到的给外链添加nofollow的代码。 一、原版代码 代码原理也挺简单,通过匹配文章content内容,若发现存在外链,就给这个外链a标签加上 rel="nofollow"属性。 这个代码常规博客确实可以用,但有可能导致一些特殊链接失效,比如这个代码很可能会让知更鸟主题的下载按钮无法弹出或者文章索引损坏,应该是替换过程中被破坏掉了。 针对这个问题,我对代码进行了第一个改进: 二、改进代码 ①、加入了对常规http://或https://开头的链接判断,就能有效的绕过知更鸟主题的一些特殊链接,就因为这些特殊链接都不带http://: ②、2014-11-26补充:加入了对 完整a标签 判断: 主要目的是为了绕过高亮代码中的一些外部链接,因为在代码中出现自己博客的跳转形式可能会破坏代码功能,比如博客分享的《百度收录查询和显示代码》,若不过滤的话,其中的百度链接将会被加上跳转,对使用者带来困惑: ③、2015-08-31补充:加入对外链图片的过滤 有朋友反馈使用后,外链图片也跳转了,导致暗箱跪了。确实会有这个情况,所以在代码中加入了图片的过滤: !preg_match('/\.(jpg|jepg|png|ico|bmp|gif|tiff)/i',$val) 偶然翻看博客旧文章,又看到了以前分享的跳转办法,觉得可以和现在的外链处理代码结合一下,或许可以相得益彰,更加完善! 详细部署步骤如下: 三、最终代码 ①、新增跳转 根据以前分享的方法,在网站根目录新增一个文件夹,命名为go,并在go文件夹下新增一个index.php,内容如下: 现在用浏览器访问http://域名/go/?url=外链就能实现跳转了, 比如访问: https://zhang.ge/go/?url=http://www.baidu.com 就能跳转到百度了。 ②、新增robots规则: 为了防止搜索引擎抓取这种跳转链接,我们可以在robots.txt里面新增禁止抓取/go的规则: ③、重写外链 i. 替换文章内容中的外链 在主题目录下的functions.php新增如下函数,即可将文章中的外链替换为go跳转的形式: ii. 替换评论者的链接 在主题目录下的functions.php查找是否存在修改评论链接为新窗口commentauthor函数,如果存在则如下修改第8行,将$url修改为/go/?url=$url,其实就是在前面新增一个go跳转即可,相同的道理! Ps:如果functions里面没有这个评论新窗口的函数,请自己找到评论列表输出的代码位置(可能在comments.php),然后参考修改即可(国内主题一般都会有个评论新窗口函数,自己仔细找找看)! iii. 知更鸟副标题转载来源链接跳转 其实知更鸟的转载来源链接本身就有nofollow,不过强迫症嘛,还是继续修改下: 打开知更鸟主题目录下的includes文件夹,找到source.php文件,如下修改$reprinted所在行即可: 看到这里,相信你应该能轻松领悟方法了吧?就是在外链链接之前加上【http://博客域名/go/?url=】即可!需要修改博客哪个位置的外链,只要找到该位置对应的主题模板,然后参考上述代码修改即可! 2015-07-16 最新补充: 有不少朋友留言要我分享张戈博客目前在用的跳转页面代码,好吧,那就分享一下吧! go.php 的代码如下: 也可以保存为 index.php文件,然后上传到网站根目录下的go文件夹(没有go文件夹就新建一个),实现 https://zhang.ge/go/?url=https://zhang.ge/ 的跳转形式。 更简单的评论者链接跳转:如果想要让评论者链接也弄成这种跳转形式,只要在WordPress主题目录下functions.php中插入如下代码即可: 记得代码中的“/go/?url=”需要根据实际使用的跳转形式修改即可!   2016-02-16 最新补充:张戈博客已分享最新跳转代码,更安全效率==>传送门  
阅读全文
网站建设

分享两种外链跳转方法,可避免权重流失。

前2天,在修改互推联盟自适应页面时,考虑到原先的跳转机制可能会对博友造成困扰,所以想修改成直接跳转模式,彻底抛弃之前强行重写 title 即 iframe 框架的不友好机制。 下面的内容是在研究外链跳转时发现的,感觉还不错,就拿来分享一下! 你或许看见过类似http://www.***.com/go.php?http://www.******.com形式的跳转链接,这样是为了站点的SEO能够对各种搜索引擎更友好,术语好像就是叫做外链跳转。更重要的是起到了保护自己域名权重的目的。 中间的过渡,很好地避免了外链的导出,有很好的到达了所需的网站,是一个两全齐美的好东东。 在这里,我有两种类似的方法,下面一一介绍给大家(仅限于支持PHP脚本的服务器),以wordpress为例: 第一种方法: 首先新建一个go.php文件,放置到wordpress的根目录下,在go.php里面输入 然后保存后,可用的外链跳转形式为:  {本站地址}/go.php?url={外链地址},再添加外链的时候,只要给外链加上统一的跳转前缀:http://网站地址/go.php?url=  即可。 第二种方法: 同样,新建一个go.php文件,放置到wordpress的根目录下,在go.php里面输入 然后保存,可用的外链跳转形式为: {本站地址}/go.php?{外链地址}  在添加外链的时候,只要给外链加上统一的跳转前缀:http://网站地址/go.php?  即可。 补充:如果你的主机环境支持ASP,那么还可以将以下代码存为“go.asp”,起到的效果是一样一样的。 以上内容来自站长之家 张戈博客采用了第二种跳转方法,速度比嗨酷哥的原始跳转要快得多,而且是直接跳转方式,详见互推联盟。 以上方法均需要在手动添加外链的时候,加上跳转前缀,比如  http://网站地址/go.php?外链地址,并不是很方便,有兴趣的童鞋可以研究下如何写到function.php里面去,强行重写外链。不过anylink插件就可以实现这个功能了。所以上面的方法是用于某种特殊情况下的。比如,互推联盟输出成员博客的链接时,就正好可以使用!因为测试anylink发现不会生效。 2015-07-16 最新补充: 有不少朋友留言要我分享张戈博客目前在用的跳转页面代码,好吧,那就分享一下吧! go.php 的代码如下: 也可以保存为 index.php文件,然后上传到网站根目录下的go文件夹(没有go文件夹就新建一个),实现 https://zhang.ge/go/?url=https://zhang.ge/ 的跳转形式。 如果想要让评论者链接也弄成这种跳转形式,只要在WordPress主题目录下functions.php中插入如下代码即可: 记得代码中的“/go/?url=”需要根据实际使用的跳转形式修改即可!
阅读全文