URL Rewrite 2.0 betaでDestinationヘッダーの書き換え
URL Rewrite Module 2.0 では、サーバー変数という形で、HTTPヘッダーの参照/変更が可能なようです。
Destinationヘッダーの書き換えによるsvn copyへの対応がしたかったんですが、
mod_headers の RequestHeader ディレクティブのようなヘッダー値の一部置換(edit)が不可能なので、かなり力業で対応してみました。
想定する状況
- VirtualSVN Server(http://192.168.0.1)のリバースプロキシとして、IIS(https://example.com)を使用
- svn copy等実行時に、Destinationヘッダーの中身が https://example.com/... で飛んでくるので、http://192.168.0.1/... に置換する。
設定
subversion用のサイトにURL Rewrite Ruleを追加し、以下のように設定。
(URLのRewrite部分は割愛)
Match URL
- "Using" で "Regular Expression" を指定
Conditions
- "Logical Grouping" を、"Match Any" に変更
- 以下の2件を追加
Input | Type | Pattern |
{HTTP_DESTINATION} | Matches the pattern | https://example.com(.*) |
{HTTP_HOST} | Matches the pattern | (.*) |
{HTTP_DESTINATION} は、Destinationヘッダーをサーバー変数として参照するための記述です。Actionsで置換しない部分をグループ化しています。
また、Destinationヘッダーが存在しないリクエストを通すために、Match Anyにした上で、無条件で通すための{HTTP_HOST}を入れています。
{HTTP_HOST}のホスト名を明示的に指定することも出来ますが、IPを別にしている場合、ホスト名とIPを併記しないとこけます。*1
また、{HTTP_HOST}のパターンの括弧を外すとエラーになります。
Actions
- Server Variables...で、以下を設定
Name | Value | Replace |
HTTP_DESTINATION | http://192.168.0.1{C:1} | On |
サーバー変数を上書きすることで、HTTPヘッダーの内容を上書き出来るようです。
{C:1}は、Conditionsでグループ化したDestinationヘッダーのホスト名以下の部分です。
まとめ
要らないDestinationヘッダーが付与されてると思うので、ここまでして対応するなら、VirtualSVNにmod_headers入れて、そっちで対応した方が良さそう(出来るかどうかは未調査)
RequestHeaderのように、サーバー変数を直接置換できるようにしてくれないかなぁ…。
参考文献
- http://learn.iis.net/page.aspx/664/using-url-rewrite-module-20/
- URL Rewrite Module 2.0 公式
- http://technet.microsoft.com/ja-jp/library/dd939095.aspx
- URL Rewrite Moduleの日本語での解説文書
- http://blog.cykyc.org/2008/11/modproxy-moddav-destination-header-and.html
- apacheでのRequestHeaderによるDestinationの置換例1
- 2007-07-29のReverseProxyのもろもろの補足 - cactusman日誌
- apacheでのRequestHeaderによるDestinationの置換例2
*1:e.g. (example.com|192.168.0.2)