Apacheのリクエスト文字数制限をmod_rewriteで

昨日の午後からWebにやたらと長いリクエストをしてくるところがある。ざっと3000バイトほど。Apacheのデフォルトでは8190なようだし、RFCでも特に制限はないようなのでまぁ世間的にはOKみたい。
でもバックエンドのZopeさんが獲得のロジックでそのコンテンツを探そうとしているようで、やたらと負荷が高くなってサービスに影響がでてしまいました。

とりあえずLimitRequestLineでリクエスト文字列サイズを制限してみる。

LimitRequestLine  256

そうすると、CGIなどでパラメータをURI渡しにしているシステムでこの制限に引っかかるところが出てきました。
おっと、そういうのは除外したいなぁと調べてみたんですが、このLimiRequestLineディレクティブはサーバ設定部分にしか書けません。とかには書けないんですね。
それにApacheの生のエラー画面がでてくるのもちょっと気に食わない。

そこで困ったときのmod_rewrite
256文字以上のリクエスURIの時にはindex.htmlを表示させる。しかし特定文字列で始まるURIにはこのルールは適用しない。
ってことでこんなルールを書きました。

    RewriteCond     %{REQUEST_URI}  "^/.{256}"
    RewriteCond     %{REQUEST_URI}  "!^/cgi-bin"
    RewriteCond     %{REQUEST_URI}  "!^/hogehoge"
    RewriteRule     ^(.*)$          http://www.example.com/index.html [P]

「256文字以上って正規表現はどう書くんだっけ」と量子指定子を調べたりしたんですが、256文字あればこの表現がマッチするのでこれでOKです。

mod_sedとかmod_luaを使うともっとエレガントにできるような気がする。それはまた今度。