迷惑な先読みアクセスを(可及的に)制限する

 自前のサーバにブログシステムを入れて運用している場合、ページを先読みするブラウザやproxyからアクセスされるとあっという間に過負荷に陥ってしまうことがある。
 Apacheの場合、例えば次のような設定でまあまあ回避できる。

SetEnvIf        X-moz prefetch prefetcher
BrowserMatch    "^Mozilla/[34567]\.0 \(compatible;\)" prefetcher
RewriteCond     %{ENV:prefetcher} =1
RewriteCond     $1      !^/error/
RewriteRule     (.*)    -       [R=503,L]
<IfModule mod_limitipconn.c>
         MaxConnPerIP    3
         NoIPLimit text/css image/* application/javascript
</IfModule>

 Mozilla系ブラウザが先読みするときはX-moz: prefetchというヘッダを送ってくる。それを蹴るのが1行目。本来のMozillaのprefetchはWebページ側からヒントを渡した場合だけ動作するようだが、Fasterfoxなどの拡張を入れた場合にはそれ以外でもプリフェッチする。そしてその場合でもこのヘッダは送られてくるらしい。ただ、Fasterfoxはそれほど行儀は悪くないようで、念のためといったところ。
 2行目は、どういうわけか、先読みするproxyは先読みのときだけ「Mozilla/4.0 (compatible;)」というイカれたAgent名を送ってくることが多いようで(しかし常にではない)、それを蹴るもの。
 /error/以下にエラーページがあると仮定している。それでループにならないようにするのが4行目。
 mod_limitipconnは同一IPアドレスからの多数同時アクセスを弾く。


 ま、根本的にはリバースプロキシを入れるとかになるのだろうけど。


 ちなみに、先読みproxyのIPアドレスを逆引きしてみると大抵IT企業のそれである。社内のproxyなのだろうが、紺屋の白袴というやつで、ちゃんと管理してほしいものである。