如何使用现场搜索处理机器人并使用太多请求溢出SQL?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用现场搜索处理机器人并使用太多请求溢出SQL?相关的知识,希望对你有一定的参考价值。

什么是最好的做法,不会骚扰洪水限制的用户,但阻止机器人进行自动搜索?

到底是怎么回事:

我更加意识到奇怪的搜索行为,我终于有时间去抓住它是谁。它是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)一段时间的机会。 当然,这不是您可以使用的最佳解决方案,但它会起作用并且对您的服务器来说成本不高。

以上是关于如何使用现场搜索处理机器人并使用太多请求溢出SQL?的主要内容,如果未能解决你的问题,请参考以下文章

我的导航栏显示了太多项目和溢出。如何在更高的屏幕宽度下折叠它? [复制]

实时 Web 应用程序使用啥以及为啥?需要解释和小型现场演示[关闭]

如何使用位置正则表达式通过 nginx 重定向/处理来自搜索引擎的请求

PyQt / Qt,带有自定义委托的表格视图以使用省略号来处理文本溢出单元格

请求太多 - Geoplugin

Ruby on Rails,如何确定请求是由机器人还是搜索引擎蜘蛛制作的?