Nginx 屏蔽WordPress垃圾评论

相信大部分用WordPress做博客/网站的用户都有这个问题,就是垃圾评论太尼玛多了~~~

不管是多么牛逼哄哄的大神级博客,还是毫不起眼无人问津的小白博客,都很难逃脱垃圾评论的骚扰,并且大部分都是一些英文的留言内容-。-

在之前,我一直用的WordPress自带的Akismet插件,有免费版的授权申请,并且效果还挺好的,大部分的垃圾评论都被拦截了,所以这个插件还是很值得推荐使用的。

但是Akismet虽然能够拦截垃圾评论,但是每当进入后台看到目前有多少条垃圾评论的时候,我会忍不住点击清空所有垃圾评论,这样每隔段时间就要清理,对于我这么懒得人来说还是一种折磨。

在这种情况下,我不得不再找其他办法来解决这个问题了。。。

最先想到的办法:禁IP

禁IP是最简单最快捷的办法了,对于长期只是用那么几个IP来发垃圾评论的来说是很有效的办法,但是,现在基本上没几个只是用固定IP来干这事的了,所以,直接PASS,这里就不贴代码了.

接着想到了:禁UA

通过分析访问日志,发现大部分的恶意评论用的都是固定的User Agent,那么就可以通过禁止User Agent来达到效果。实现的方法是修改网站conf配置文件,在server大括号里面加上以下代码:

if ( $http_user_agent ~* "Mozilla/5.0 \(Windows NT 6.1; rv:26.0\) Gecko/20100101 Firefox/26.0") {
    # 匹配$http_user_agent,如果为Mozilla/5.0 (Windows NT 6.1; rv:26.0) Gecko/20100101 Firefox/26.0 则返回403
    return 403; 
}

这对于使用固定UA的访问来说是很有效果的,但是很可能造成误伤,只要是匹配到这个UA的访问都会被返回403,所以对上面的代码进行了修改完善,通过缩小范围来屏蔽垃圾评论:

set $stop 0;
if ($request ~* "/wp-comments-post.php"){
    set $stop "${stop}1";
}
if ($http_user_agent ~* "Mozilla/5.0 \(Windows NT 6.1; rv:26.0\) Gecko/20100101 Firefox/26.0"){
    set $stop "${stop}2";
}
if ($stop = "012"){
    return 403;
}

上面的代码可以实现只对访问wp-comments-post.php的指定UA进行屏蔽。

可是这还不够,因为没过几天,发现评论垃圾又出来了,很明显他们修改了UA了,所以这个方案还是不靠谱。。。

上面的方案失败了,其实也早知道上面的办法不是长久之计,只是没时间去搞这个,只是先应付一阵子也好。最后想到了通过COOKIE来屏蔽,因为通过记录访客的cookie发现了垃圾评论是没有cookie的,所以这就简单了,只哟判定cookie为空就行,这里我只对wp-comments-post.php的访问进行了判断,因为其他页面也判断的话还需要考虑排除各种搜索蜘蛛,这里我们只要拦截垃圾评论就行,所以最后的代码如下:

set $stop 0;
if ($request ~* "/wp-comments-post.php"){
    set $stop "${stop}1";
}
if ($http_cookie = ""){
    set $stop "${stop}2";
}
if ($stop = "012"){
    return 403;
}

上面的代码加到网站conf配置文件,在server大括号里面

最后

到这里基本上已经屏蔽了垃圾评论了,世界总算清净了!

可是这还是会有不完美的地方,比如我们现在可以很容易的记录网站的cookie了,所以对于cookie的解决方案还有完善的地方,比如通过页面JS前端添加一个指定的cookie,然后通过判断这个cookie来实现,因为对于目前的爬虫来说是识别不了JS的。

最后对于Apache用户来说,可以参考这个http://stackoverflow.com/questions/19382160/htaccess-compare-cookie-value-and-redirect-if-evaluation-returns-true-false