mod_rewriteでRewriteCondの-Uオプション

mod_rewriteを使ってこんな書き換え処理を実現したかったんですが、あきらめたという話。

  • 特定の拡張子を持っているURIを別ホストのURI書き換える。

http://www.example.com/hogehoge.pdfhttp://static.example.com/hogehoge.pdf

mod_rewriteのRewriteCondで-Uというオプションがあります。ドキュメントではこんなことが書かれています。

・'-U' (is existing URL, via subrequest)
Checks whether or not TestString is a valid URL, accessible 
via all the server's currently-configured access controls for
 that path. This uses an internal subrequest to do the check,
 so use it with care - it can impact your server's 
performance!

以下ヘボな約。

.-U(URLをサブリクエストを通してあるかどうかチェック)
TestStringが有効かどうか、サーバ設定中のアクセスコントロール
を通してパスへのリクエストが有効かどうかをチェックする。
内部サブリクエストを使ってチェックするので使用する場合はパフォーマンスに留意してね。

なんか使えそうな気がするのでこんなルールを書いてみました。

        RewriteCond     %{REQUEST_URI}          "\.(gif|jpe?g|png|css|js|pdf)$"
        RewriteCond     http://static.example.com/%{REQUEST_URI} -U
        RewriteRule     ^(.*)$    http://static.example.com/$1 [P]

ところが、この二番目にかいたRewriteCondですが、必ずTrueになるんです。ログをみると、存在しない、つまりリクエストをだすと404になるURIに対しても200を返してくる。
どうしたことだと調べることしばし。Apacheのバグトラックの履歴にもおなじ質問が投げれられているのを発見。
ここがそうです。

なるほど、サブリクエストとして処理できるかどうかをチェックしているだけなんですね。ドキュメントにもそう書いてあるな。URIとして有効で、拒否られない場合は200なんだ。

ということで、上記の目的は諦めました。考えてみればそれはそうで、URI書き換えの度にHTTPリクエストを出していたらパフォーマンスにえらい影響がでること必至です。
目的は別手段(仮想ホストをファイルシステムが見えるところへ移動)で実現することにしました。