URL 書き換え v2 とアプリケーション要求ルーティング処理を使用したリバース プロキシ
作成者: Ruslan Yakushev
このチュートリアルでは、URL 書き換えモジュールとアプリケーション要求ルーティング (ARR) を使用して、複数のバックエンド アプリケーションを扱うリバース プロキシ サーバーを実装する方法について説明します。
前提条件
このチュートリアルを完了するには、次のことが必要です:
- ASP.NET 役割サービスが有効になっている IIS 7 以上。
- URL 書き換えモジュールがインストールされている (応答書き換えに関する部分を完了する場合は、バージョン 2.0 が必要です)
- アプリケーション要求ルーティング バージョン 1.0 またはバージョン 2.0 がインストールされている
はじめに
URL 書き換えモジュールとアプリケーション要求ルーティングを使用すると、複雑で柔軟な負荷分散とリバース プロキシ構成を実装できます。 非常に一般的なリバース プロキシのシナリオは、インターネット経由で複数の内部 Web アプリケーションを使用できるようにするというものです。 Web 要求を受信し、処理のために複数のイントラネット アプリケーションに転送するリバース プロキシ サーバーとして、インターネットにアクセスできる Web サーバー使用されます。次の図は、リバース プロキシ シナリオの一般的な構成を示しています。
ARR サーバーのドメイン名が http://contoso.com
であると仮定すると、各 Web アプリケーションには次の URL を使用してアクセスできます。
http://contoso.com/webmail/
http://contoso.com/payroll/
http://contoso.com/webmail/default.aspx
に対して要求が行われると、ARR は、これらの要求を URL http://webmail/default.aspx
を使用して特定の内部サーバーに転送します。 同様に、http://contoso.com/payroll/
への要求は http://payroll/default.aspx
に転送されます。
さらに、内部アプリケーションが、それらのアプリケーション内の他の場所にリンクするリンクを応答 HTML に挿入する場合は、応答がクライアントに返される前に、それらのリンクを変更する必要があります。 たとえば、http://webmail/default.aspx
からのページには、次のようなリンクが含まれている場合があります。
<a href="/default.aspx?id=1">link</a>
その後、ARR サーバーはこのリンクを次のように変更する必要があります。
<a href="/webmail/default.aspx?id=1">link</a>
サンプル Web サイトの作成
わかりやすくするために、このチュートリアルで使用するリバース プロキシ シナリオは 1 台のサーバーに実装され、IIS の "既定の Web サイト" はリバース プロキシ サイトとして機能し、Web メールアプリケーションと給与計算アプリケーションは同じサーバー上の別個の IIS Web サイトでホストされます。
サンプル Web サイトを作成するには:
次のフォルダーに、"webmail" と "payroll" という名前の 2 つのフォルダーを作成します。
%SystemDrive%\inetpub\ folder.
"webmail" と "payroll" という名前の 2 つの IIS Web サイトを作成し、それらが
%SystemDrive%\inetpub\
の下にある対応するフォルダーを指すようにします。 サイトごとに異なる IP ポートを使用します。
次のコマンドを使用してサイトを作成できます:%windir%\System32\inetsrv\appcmd.exe add site /name:"webmail" /bindings:http/*:8081: /physicalPath:"%SystemDrive%\inetpub\webmail" %windir%\System32\inetsrv\appcmd.exe add site /name:"payroll" /bindings:http/*:8082: /physicalPath:"%SystemDrive%\inetpub\payroll"
次のフォルダーに default.aspx という名前のファイルを作成します:
%SystemDrive%\inetpub\webmail
以下の ASP.NET マークアップをコピーし、ファイルに貼り付けて、ファイルを保存します。
<%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Reverse Proxy Test - WebMail Application</title> </head> <body> <h1>Reverse Proxy Test Page - WebMail Application</h1> <p>Requested URL path is <%= Request.ServerVariables["SCRIPT_NAME"] %><p> <p><a href="<%= Request.ServerVariables["SCRIPT_NAME"] %>">Here</a> is the link to this page.</p> </body> </html>
次のフォルダーに default.aspx という名前のファイルを作成します:
%SystemDrive%\inetpub\payroll
以下の ASP.NET マークアップをコピーし、ファイルに貼り付けて、ファイルを保存します。
<%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Reverse Proxy Test - Payroll Application</title> </head> <body> <h1>Reverse Proxy Test Page - Payroll Application</h1> <p>Requested URL path is <%= Request.ServerVariables["SCRIPT_NAME"] %><p> <p><a href="<%= Request.ServerVariables["SCRIPT_NAME"] %>">Here</a> is the link to this page.</p> </body> </html>
サイトが正しく動作していることを確認するには、Web ブラウザーを開き、次の URL を要求します:
http://localhost:8081/default.aspx
http://localhost:8082/default.aspx
リバース プロキシのルールの構成
チュートリアルのこのセクションでは、作成したサンプル Web サイトを操作するようにリバース プロキシ機能を構成します。
リバース プロキシ機能の有効化
リバース プロキシ機能は既定で無効になっているため、最初に有効にする必要があります。
- IIS マネージャーを開く
- 左側のツリー ビューでサーバー ノードを選択し、[アプリケーション要求ルーティング処理] 機能をクリックします。
- [プロキシの有効化] チェックチェック ボックスをオンにします。 このページのその他の設定はすべて既定値のままにします。
Web メール アプリケーションのルールの作成
次の 2 つの再書き込みルールを作成します:
- 要求された URL パスが "webmail" で始まる限り、
http://localhost:8081/
にある Web メール アプリケーションへの要求をプロキシ経由にする書き換えルール。 - 要求された URL パスが "payroll" で始まる限り、
http://localhost:8082/
にある給与計算アプリケーションへの要求をプロキシ経由にする書き換えルール。
リバース プロキシの書き換えルールを追加するには:
以下の場所にある web.config ファイルを開きます。
%SystemDrive%\inetpub\wwwroot\
/configuration/system.webServer 要素の下に以下のコードを追加してからファイルを保存します。
<rewrite> <rules> <rule name="Reverse Proxy to webmail" stopProcessing="true"> <match url="^webmail/(.*)" /> <action type="Rewrite" url="http://localhost:8081/{R:1}" /> </rule> <rule name="Reverse Proxy to payroll" stopProcessing="true"> <match url="^payroll/(.*)" /> <action type="Rewrite" url="http://localhost:8082/{R:1}" /> </rule> </rules> </rewrite>
書き換えルールの作成の詳細については、「URL 書き換えモジュールの書き換えルールの作成」を参照してください。
リバース プロキシ機能のテスト
Web ブラウザーを開き、http://localhost/webmail/default.aspx
に要求を行います。 Web メールのテスト ページからの応答が表示されるはずです。 さらに、http://localhost/payroll/default.aspx
に要求を行います。 給与計算のテスト ページからの応答が表示されるはずです。
どちらの場合も、応答内のリンクが http://localhost/default.aspx
を指すことに注意してください。 このリンクをクリックすると、サーバーから 404 (ファイルが見つかりません) という応答が返されます。 次のセクションでは、アプリケーションによって生成された応答 HTML のリンクを修正するアウトバウンド ルールを作成する方法について説明します。
応答書き換えのルールの構成
ドキュメントのこのセクションは、URL Rewrite Module Version 2.0 for IIS 7 に適用されます。
応答 HTML 内のすべてのリンクを次のように置き換えるアウトバウンド ルールを定義します。
<a href="/default.aspx">...</a>
は次のように置き換えられます。
<a href="/webmail/default.aspx">...</a>
(応答が Web メール アプリケーションから来た場合)
and
<a href="/payroll/default.aspx">...</a>
(応答が給与計算アプリケーションから来た場合)
警告
応答ヘッダーまたは応答コンテンツが送信書き換えルールによって変更される場合は、応答に挿入されるテキストにクライアント側の実行可能コードが含まれないように注意する必要があります。これにより、クロスサイト スクリプティングの脆弱性が発生する可能性があるためです。 これは、書き換えルールで HTTP ヘッダーやクエリ文字列などの信頼されていないデータを使用して、HTTP 応答に挿入される文字列を構築する場合に特に重要です。 このような場合、置換文字列は HtmlEncode 関数を使用して HTML エンコードする必要があります。次に例を示します:
<action type="Rewrite" value="{HtmlEncode:{HTTP_REFERER}}" />
ルールを作成するには、次の手順に従います。
- IIS マネージャーに移動します。
- [既定の Web サイト] を選択します。
- 機能ビューで、[URL 書き換え] をクリックします。
- 右側の [操作] ウィンドウで、[ルールの追加...] をクリックします。 [ルールの追加] ダイアログで、[送信ルール] カテゴリの下にある [空のルール] を選択し、[OK] をクリックします。
ここで、実際のアウトバウンドルールを定義する必要があります。 URL Rewrite Module 2.0 では、以下の情報を指定してアウトバウンド書き換えルールを定義します。
- ルールの名前。
- このルールを応答に適用するかどうかを制御する省略可能な前提条件。
- 応答内の文字列の照合に使用するパターン。
- 省略可能な一連の条件。
- パターンが一致し、すべての条件チェックが成功した場合に実行するアクション。
ルールの名前付け
[名前] テキスト ボックスに、ルールを一意に識別する名前を入力します (例: "アプリケーション プレフィックスの追加")。
前提条件の定義
前提条件は、応答に対してアウトバウンド規則の評価を実行する必要があるかどうかを評価するために使用されます。 たとえば、HTML コンテンツを変更するルールの場合、コンテンツ タイプ ヘッダーが "text/html" に設定された HTTP 応答のみを、このルールに対して評価する必要があります。 アウトバウンド規則の評価とコンテンツの書き換えは、WEB アプリケーションのパフォーマンスに悪影響を与える可能性のある CPU 負荷の高い操作です。 そのため、前提条件を使用して、アウトバウンド規則が適用されるケースを絞り込みます。
作成する規則は HTML 応答にのみ適用する必要があるため、HTTP 応答ヘッダー コンテンツ タイプが "text/html" と等しいかどうかをチェックする前提条件を定義します。
前提条件を定義するには:
事前条件の一覧で、"<新しい事前条件の作成...>" を選択します。
これにより、[事前条件エディター] ダイアログが表示され、前提条件を定義する必要があります。 前提条件の設定を以下のように指定します:
[OK] をクリックして前提条件を保存し、[ルールの編集] ページに戻ります。
照合するスコープの定義
アウトバウンド書き換えルールは、HTTP ヘッダーのコンテンツまたは応答本文のコンテンツで動作できます。 このルールでは応答のコンテンツ内のリンクを置き換える必要があるため、[照合スコープ] のドロップダウン リストで [応答] を選択します。
タグ フィルターの定義
タグ フィルターを使用すると、応答全体を規則のパターンに対して評価するのではなく、パターン マッチングのスコープを特定の HTML 要素のみにすることができます。 パターン マッチングは非常に CPU 負荷の高い操作なので、応答全体をパターンに対して評価すると Web アプリケーションの応答時間が大幅に遅くなる可能性があります。 タグ フィルターを使用すると、パターン マッチングを特定の HTML タグのコンテンツ内だけに適用するよう指定できるので、正規表現パターンに対して評価する必要があるデータの量を大幅に減らせます。
タグ フィルターを定義するには、[コンテンツの照合範囲:] ドロップダウン リストを展開してから、[A (href 属性)] チェック ボックスをオンにします。
こうすると以下の例のように、ハイパーリンクの href 属性の値だけにパターンを適用するように規則が設定されます。
<a href="this string will be used for pattern matching">Some link</a>
パターンの定義
[パターン] テキスト ボックスに、以下の文字列を入力します。
^/(.*)
この文字列は、パターンが、"/" 記号で始まる任意の URL パス文字列と一致することを指定する正規表現です。
パターン内でのかっこの使用に注意してください。 これらのかっこによりキャプチャ グループが作成され、後でルール内で逆参照を使用して参照できます。
条件の定義
応答 HTML のリンクは、Web メール アプリケーションまたは給与計算アプリケーションからの応答である場合にのみ変更する必要があります。 そのことをチェックするには、クライアントによって要求された URL パスを分析する条件を使用します。 また、要求された URL からアプリケーション フォルダーをキャプチャする条件パターンを定義して、応答のリンクを書き換えるときにルールでそのフォルダーを再利用できるようにします。
- 条件グループ ボックスを展開します。
- [追加] ボタンをクリックして、条件を定義するためのダイアログ ボックスを表示します。
- "条件入力:" には、"{URL}" という文字列を入力します。 これにより、Web クライアントによって要求された URL パスを使用するように URL 書き換えモジュールが構成されます。
- ドロップダウン コンボ ボックスで、[パターンに一致する] を選びます。
- [パターン] テキストボックスに、「
^/(webmail|payroll)/.*
」と入力します。 この正規表現は、/webmail
または/payroll
で始まる URL パスを照合するために使用されます。 パターン内のかっこは、一致する URL 文字列の一部をキャプチャして、置換 URL を構築するときに使用できるようにします。 - [OK] をクリックして条件を保存し、[ルールの追加] UI に戻ります。
アクションの定義
"アクション" グループ ボックスに一覧表示されている "書き換え" アクションの種類を選択します。 [値] テキスト ボックスに、以下の文字列を入力します。
/{C:1}/{R:1}
この文字列は、リンク アドレスの書き換えに使用する新しい値を指定します。 {C:1} は条件パターン キャプチャ グループへの前方参照であり、"webmail" または "payroll" 文字列で置き換えられます。 {R:1} はルール パターン キャプチャ グループへの前方参照であり、この特定のケースではハイパーリンクで使用された元の URL パスに置き換えられます。
その他の設定はすべて既定値のままにします。 [アウトバウンド ルールの編集] プロパティ ページは次のようになるはずです:
右側にある [適用] アクションをクリックして、ルールを保存します。
作成したルールの構成を確認するには、%SystemDrive%\inetput\wwwroot\
にある web.config ファイルを開きます。 このファイルには、このルール定義を含む <rewrite>
セクションが示されます。
<rewrite>
<rules>
<rule name="Reverse Proxy to webmail" stopProcessing="true">
<match url="^webmail/(.*)" />
<action type="Rewrite" url="http://localhost:8081/{R:1}" />
</rule>
<rule name="Reverse Proxy to payroll" stopProcessing="true">
<match url="^payroll/(.*)" />
<action type="Rewrite" url="http://localhost:8082/{R:1}" />
</rule>
</rules>
<outboundRules>
<rule name="Add application prefix" preCondition="IsHTML">
<match filterByTags="A" pattern="^/(.*)" />
<conditions>
<add input="{URL}" pattern="^/(webmail|payroll)/.*" />
</conditions>
<action type="Rewrite" value="/{C:1}/{R:1}" />
</rule>
<preConditions>
<preCondition name="IsHTML">
<add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
</preCondition>
</preConditions>
</outboundRules>
</rewrite>
ルールのテスト
ルールが応答内の URL を正しく書き換えるかどうかをテストするには、Web ブラウザーを開き、http://localhost/webmail/default.aspx
または http://localhost/payroll/default.aspx
への要求を行います。 アウトバウンド書き換えルールにより HTML 応答内のリンクが変更されていることがわかります。
まとめ
このチュートリアルでは、リバース プロキシ シナリオを実装するように URL 書き換えモジュールとアプリケーション要求ルーティングを構成する方法について説明しました。 また、URL 書き換えモジュール 2.0 の新しい送信書き換え機能を使用して、アプリケーションの応答のリンクを修正してからそれらを Web クライアントに提供する方法についても学習しました。
リバース プロキシを使用する場合、多くの場合、HTTP 応答ヘッダーの書き換えも必要になることに注意してください。 URL 書き換えモジュール 2.0 を使用して応答 HTTP ヘッダーを変更する方法については、「HTTP 応答ヘッダーの変更」を参照してください。