什么是最好的做法,不会骚扰洪水限制的用户,但阻止机器人进行自动搜索?
到底是怎么回事:
我更加意识到奇怪的搜索行为,我终于有时间去抓住它是谁。它是157.55.39。*也称为Bing。这很奇怪,因为当检测到_GET ['q']时,会添加noindex。
然而问题是,它们正在减慢SQL服务器的速度,因为有太多的请求实例进入。
到目前为止我做了什么:
我已经实施了搜索洪水限制。但是,因为我使用会话cookie,从上一个搜索时间戳检查和计算 - 明显忽略cookie并继续。
最糟糕的情况是添加reCAPTHA,但我不想要“你是人吗?”每次搜索时都会勾选。只有在检测到洪水时才会出现。所以基本上,真正的问题是,如何检测来自客户端的太多请求以触发某种重新连接以停止请求。
编辑#1: 我目前处理的情况是:
<?
# Get end IP
define('CLIENT_IP', (filter_var(@$_SERVER['HTTP_X_FORWARDED_IP'], FILTER_VALIDATE_IP) ? @$_SERVER['HTTP_X_FORWARDED_IP'] : (filter_var(@$_SERVER['HTTP_X_FORWARDED_FOR'], FILTER_VALIDATE_IP) ? @$_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'])));
# Detect BING:
if (substr(CLIENT_IP, 0, strrpos(CLIENT_IP, '.')) == '157.55.39') {
# Tell them not right now:
Header('HTTP/1.1 503 Service Temporarily Unavailable');
# ..and block the request
die();
}
有用。但它似乎是解决更系统问题的另一种临时解决方案。
我想提一下,我仍然希望搜索引擎,包括Bing来索引/search.html,而不是实际搜索那里。没有“最新搜索”或类似的东西,所以它是一个神秘的地方,他们从中获取查询。
编辑#2 - 我是如何解决它的 如果将来有其他人有这些问题,我希望这会有所帮助。
首先,事实证明Bing拥有与Google相同的网址参数功能。所以我能告诉Bing忽略URL参数“q”。
基于正确的答案,我添加了参数q的禁止行到robots.txt:
Disallow: /*?q=*
Disallow: /*?*q=*
我还告诉bing网站管理员控制台,不要打扰我们的高峰流量。
总的来说,这立即显示了服务器资源使用的积极反馈。但是,我将为相同的查询实现总体泛洪限制,特别是涉及_GET的情况。因此,如果Bing决定访问AJAX调用(例如:?action = upvote&postid = 1)。
垃圾邮件是所有网站所有者都在努力解决的问题。 并且有很多方法可以建立良好的保护,从非常简单的方式开始,并通过非常强硬的保护机制完成。
但对你来说,我现在看到一个简单的解决方案。 使用robots.txt并禁止Bing spider抓取您的搜索页面。 你可以这样做very easy。
您的robots.txt文件如下所示:
User-agent: bingbot
Disallow: /search.html?q=
但这将完全阻止搜索引擎蜘蛛抓取您的搜索结果。 如果您只想限制此类请求,但不能完全阻止它们,请尝试以下操作:
User-agent: bingbot
crawl-delay: 10
这将迫使Bing每隔10秒抓取您的网站页面。 但是有了这样的延迟,它每天只会抓取8,640页(这是每天非常少量的请求)。 如果你对此很好,那你就好了。 但是,如果您希望服务器本身手动控制此行为,保护搜索表单不仅来自Web爬虫,还来自黑客,该怎么办? 他们可以轻松地向您的服务器发送超过50,000个/小时的请求。 在这种情况下,我会建议你2个解决方案。 首先,将CloudFlare连接到您的网站,并且不要忘记检查您的服务器真实IP是否仍然可以通过ViewDNS IP History等服务获得,因为许多具有CF保护的网站缺乏(甚至很受欢迎)。 如果您的活动服务器IP在历史记录中可见,那么您可以考虑更改它(强烈推荐)。 其次,您可以使用MemCached存储洪水数据并检测某个IP是否查询过多(即30 q / min)。 如果他们这样做,阻止他们使用执行(通过MemCached)一段时间的机会。 当然,这不是您可以使用的最佳解决方案,但它会起作用并且对您的服务器来说成本不高。