mod_rewriteでRewriteCondの-Uオプション
mod_rewriteを使ってこんな書き換え処理を実現したかったんですが、あきらめたという話。
http://www.example.com/hogehoge.pdf → http://static.example.com/hogehoge.pdf
- 但し、書き換え先のURIが有効かどうかを確認する(上記例だとhttp://static.example.com/hogehoge.pdfが400未満のレスポンスコードを返すこと)
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リクエストを出していたらパフォーマンスにえらい影響がでること必至です。
目的は別手段(仮想ホストをファイルシステムが見えるところへ移動)で実現することにしました。