他の答えによると、Facebookからの半公式の言葉は「それを吸う」です。それは彼らがクロール遅延に従うことができないことを私に困惑させます(はい、私はそれが「クローラー」ではないことを知っています、しかしあなたがそれを呼びたいものは何でも、数秒で100ページをGETすることはクロールです)。
彼らの傲慢さに訴えることはできず、彼らのIPブロックを削除することはかなり厳しいので、ここに私の技術的な解決策があります。
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
改善の提案は大歓迎です...私はそれらが巨大な爆発を伴ういくつかの並行性の問題であるかもしれないと思います。