什么是最好的做法是不要用洪水限制惹恼用户,但阻止机器人进行自动搜索?
到底是怎么回事:
我更加意识到奇怪的搜索行为,我终于有时间去了解它是谁。它是 157.55.39.*,也称为 Bing。这很奇怪,因为当检测到 _GET['q'] 时,会添加 noindex。
然而问题是,他们正在减慢 SQL 服务器的速度,因为有太多的请求实例进入。
到目前为止我做了什么:
我已经实施了搜索洪水限制。但是,由于我使用会话 cookie 执行此操作,因此从上次搜索时间戳检查和计算 - bing 显然会忽略 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 相同的 URL 参数功能。所以我能够告诉 Bing 忽略 URL 参数“q”。
根据正确答案,我在 robots.txt 中添加了参数 q 的不允许行:
Disallow: /*?q=*
Disallow: /*?*q=*
我还在 bing 网站管理员控制台中告诉我们,不要在高峰流量时打扰我们。
总体而言,这立即显示了服务器资源使用情况的积极反馈。但是,我将为相同的查询实施总体泛洪限制,特别是在涉及 _GET 的情况下。因此,万一 Bing 决定访问 AJAX 调用(例如:?action=upvote&postid=1)。