有谁知道如何让“facebookexternalhit”机器人传播流量?
我们的网站每 45 到 60 分钟就会受到一次攻击,峰值约为 10 次。每秒 400 个请求,来自 facebook netblocks 的 20 到 30 个不同的 IP 地址。在尖峰之间,流量不会消失,但负载是可以接受的。当然,我们不想阻止机器人,但这些尖峰是有风险的。我们更愿意看到机器人随着时间的推移平均分配它的负载。看看它的行为就像 Googlebot 和它的 friend 一样。
我看过相关的错误报告(First Bug、Second Bug 和第三个错误 (#385275384858817)),但找不到任何关于如何管理负载的建议。
最佳答案
根据其他答案,来自 Facebook 的半官方词是“suck it”。他们让我感到困惑cannot follow Crawl-delay (是的,我知道它不是“爬虫”,但是在几秒钟内获取 100 页就是爬虫,无论您如何调用它)。
由于不能迎合他们的狂妄自大,并且删除他们的 IP block 是非常严厉的,所以这是我的技术解决方案。
在 PHP 中,对每个请求尽快执行以下代码。
define( 'FACEBOOK_REQUEST_THROTTLE', 2.0 ); // Number of seconds permitted between each hit from facebookexternalhit
if( !empty( $_SERVER['HTTP_USER_AGENT'] ) && strpos( $_SERVER['HTTP_USER_AGENT'], 'facebookexternalhit' ) === 0 ) {
$fbTmpFile = sys_get_temp_dir().'/facebookexternalhit.txt';
if( $fh = fopen( $fbTmpFile, 'c+' ) ) {
$lastTime = fread( $fh, 100 );
$microTime = microtime( TRUE );
// check current microtime with microtime of last access
if( $microTime - $lastTime < FACEBOOK_REQUEST_THROTTLE ) {
// bail if requests are coming too quickly with http 503 Service Unavailable
header( $_SERVER["SERVER_PROTOCOL"].' 503' );
die;
} else {
// write out the microsecond time of last access
rewind( $fh );
fwrite( $fh, $microTime );
}
fclose( $fh );
} else {
header( $_SERVER["SERVER_PROTOCOL"].' 429' );
die;
}
}
您可以使用类似以下的命令行对此进行测试:
$ rm index.html*; wget -U "facebookexternalhit/1.0 (+http://www.facebook.com/externalhit_uatext.php)" http://www.foobar.com/; less index.html
欢迎提出改进建议...我猜它们可能是一些并发性问题,而且影响巨大。
关于facebook - 来自 facebookexternalhit 机器人的过多流量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11521798/