今天,我的服务器在短短 2 分钟内就承受了数百个针对我网站联系页面 (/contact) 的请求,导致服务器超负荷。
我的 Apache 日志中出现了数百行这样的内容:
*31.13.115.6 - - [18/Jun/2019:10:54:39 +0200] "GET /contacto HTTP/1.1" 301 331 "-" "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)" 232*
*31.13.115.25 - - [18/Jun/2019:10:54:39 +0200] "GET /contacto HTTP/1.1" 301 331 "-" "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)" 232*
我不确定这是什么原因造成的,但我的服务器因此瘫痪了。我想确保这种事情不会再发生。
我的服务器提供商告诉我,我可以使用 RewriteCond 在我的 .htaccess 中添加规则来阻止这些请求。
我知道我必须使用类似的东西:
RewriteCond %{HTTP_USER_AGENT} "facebookexternalhit/1.1"
但我对此不太了解。
MrWhite 的更新:
我想我知道问题可能出在哪里。我有一个旧网站 oldsite.com,它被重定向到我的新网站 newsite.com。在 oldsite.com 的 htaccess 中,我添加了以下几行来创建重定向:
oldsite.com/.htaccess 中的规则
RewriteEngine on RewriteRule ^(.*)$ https://www.newsite.com/$1 [R=301,L]
这条规则是因为我更改了网站的域名而创建的,那么这条规则的目标是将旧网站的流量重定向到新网站,而不会损害 SEO。
到目前为止,它运行良好。您认为这可能是导致这种情况的原因吗?如果是这样,您认为我需要在 www.oldsite.com/.htaccess 中更改此规则,而不是在 www.newsite.com/.htaccess 中添加其他规则吗?
答案1
您声明这些请求是针对您的联系页面的/contact
,但是,您发布的日志条目是针对/contacto
(和额外的“o”)的,并且这些条目显示了 301 重定向响应,这将触发对您的服务器的第二个请求(前提是爬虫遵循重定向)。为什么会有 301 重定向?您要重定向到哪个页面?
这些确实似乎与真正的 Facebook“爬虫”有关,但正如众多 StackOverflow 问题所指出的那样,Facebook 爬虫似乎确实容易变得相当激进!
RewriteCond %{HTTP_USER_AGENT} "facebookexternalhit/1.1"
(条件)指令RewriteCond
本身不执行任何操作。您需要一个RewriteRule
才能实际执行某些操作。
例如:
RewriteCond %{HTTP_USER_AGENT} ^facebookexternalhit/1\.1
RewriteRule ^contact$ - [F]
上述代码将向所有以/contact
开头的用户代理发送 403 Forbidden 错误facebookexternalhit/1.1
。(这是一个正则表达式,因此文字点应该用反斜杠转义。)
该请求自然仍会击中您的应用程序服务器(要完全阻止该请求,您将需要某种代理),但现在它并没有做太多事情。
上面链接问题中接受的答案是关于发送429 Too Many Requests
状态(连同Retry-After
标题) - 但这仅在快速连续发送一定数量的请求之后(提供 PHP 脚本)。