URL 書き換え v2 とアプリケーション要求ルーティングを使用したリバース プロキシ

Ruslan Yakushev

このチュートリアルでは、URL 書き換えモジュールと アプリケーション要求ルーティング (ARR) を使用して、複数のバックエンド アプリケーションに リバース プロキシ サーバー を実装する方法について説明します。

前提条件

このチュートリアルを実行するには、次のものが必要です。

  1. ASP.NET ロール サービスが有効になっている IIS 7 以降。
  2. URL 書き換えモジュールがインストールされている (応答書き換えに関する部分を完了する場合は、バージョン 2.0 が必要です)
  3. アプリケーション要求ルーティング バージョン 1.0 またはバージョン 2.0 がインストールされている

はじめに

URL 書き換えモジュールとアプリケーション要求ルーティングを使用すると、複雑で柔軟な負荷分散とリバース プロキシ構成を実装できます。 非常に一般的なリバース プロキシ のシナリオは、インターネット経由で複数の内部 Web アプリケーションを使用できるようにするためです。 インターネットにアクセスできる Web サーバーは、Web 要求を受信し、処理のために複数のイントラネット アプリケーションに転送するリバース プロキシ サーバーとして使用されます。次の図は、リバース プロキシ シナリオの一般的な構成を示しています。

リバース プロキシ シナリオの一般的な構成の図。

ARR サーバーにドメイン名 http://contoso.comがあると仮定すると、次の URL を使用して各 Web アプリケーションにアクセスできます。

  • 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 サイトの例を作成するには:

  1. 次のフォルダーに、"webmail" と "payroll" という名前の 2 つのフォルダーを作成します。

    %SystemDrive%\inetpub\ folder.
    
  2. の下の対応するフォルダーを指す "webmail" と "%SystemDrive%\inetpub\" という名前の 2 つの IIS Web サイトを作成します。 サイトごとに異なる 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"
    
  3. 次のフォルダーに default.aspx という名前のファイルを作成します。

    %SystemDrive%\inetpub\webmail
    
  4. 次の 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>
    
  5. 次のフォルダーに default.aspx という名前のファイルを作成します。

    %SystemDrive%\inetpub\payroll
    
  6. 次の 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>
    
  7. サイトが正常に動作していることを確認するには、Web 参照を開き、次の URL を要求します。

    http://localhost:8081/default.aspx
    
    http://localhost:8082/default.aspx
    

リバース プロキシの規則の構成

チュートリアルのこのセクションでは、作成した Web サイトの例を操作するようにリバース プロキシ機能を構成します。

リバース プロキシ機能の有効化

リバース プロキシ機能は既定で無効になっているため、最初に有効にする必要があります。

  1. IIS マネージャーを開く
  2. 左側のツリー ビューでサーバー ノードを選択し、[アプリケーション要求ルーティング] 機能をクリックします。
    I I S マネージャーのスクリーンショット。さまざまなアイコンが表示されます。[アプリケーション要求ルーティング] アイコンが強調表示されています。
  3. [プロキシを有効にする] チェック ボックスをオンにします。 このページの他のすべての設定は既定値のままにします。
    [アプリケーション要求ルーティング] ページのスクリーンショット。[プロキシを有効にする] が強調表示され、選択されています。

Web メール アプリケーションのルールの作成

次の 2 つの書き換え規則を作成します。

  • 要求された URL パスが "webmail" で始まる限り、 http://localhost:8081/ で webmail アプリケーションへの要求をプロキシする書き換えルール。
  • 要求された URL パスが "payroll" で始まる限り、 http://localhost:8082/ で給与計算アプリケーションへの要求をプロキシする書き換えルール。

リバース プロキシの書き換え規則を追加するには:

  1. 次の場所にある web.config ファイルを開きます。

    %SystemDrive%\inetpub\wwwroot\
    
  2. /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に要求を行います。 給与テスト ページからの応答が表示されます。

リバース プロキシ テスト ページ Web メール アプリケーションのスクリーンショット。下部の U R L h t t p コロンスラッシュローカルホストスラッシュデフォルトドットs p xが強調表示されています。

どちらの場合も、応答内のリンクが http://localhost/default.aspxを指していることに注意してください。 このリンクをクリックすると、サーバーから 404 (ファイルが見つかりません) という応答が返されます。 次のセクションでは、アプリケーションによって生成された応答 HTML のリンクを修正する送信規則を作成する方法について説明します。

応答書き換えの規則の構成

ドキュメントのこのセクションは、 IIS 7 の URL 書き換えモジュール バージョン 2.0 に適用されます。

応答 HTML 内のすべてのリンクを次のように置き換える送信規則を定義します。

<a href="/default.aspx">...</a>

は次のように置き換えられます。

<a href="/webmail/default.aspx">...</a>

(応答が webmail アプリケーションから来た場合)

そして

<a href="/payroll/default.aspx">...</a>

(給与計算アプリケーションからの応答の場合)

Warnung

応答ヘッダーまたは応答コンテンツが送信書き換えルールによって変更された場合は、応答に挿入されるテキストにクライアント側の実行可能コードが含まれず、クロスサイト スクリプティングの脆弱性が発生する可能性があることを確認するために、特別な注意が必要です。 これは、書き換えルールで HTTP ヘッダーやクエリ文字列などの信頼されていないデータを使用して、HTTP 応答に挿入される文字列を構築する場合に特に重要です。 このような場合、置換文字列は HtmlEncode 関数を使用して HTML エンコードする必要があります。次に例を示します。

<action type="Rewrite" value="{HtmlEncode:{HTTP_REFERER}}" />

ルールを作成するには、次の手順に従います。

  1. IIS マネージャーに移動する
  2. [既定の Web サイト] を選択する
  3. 機能ビューで、[URL 書き換え] をクリックします
    I I S マネージャーのスクリーンショット。[接続] ウィンドウには、展開されたナビゲーション ツリーが表示されます。既定の Web サイトが強調表示されています。[既定の Web サイトホーム] ウィンドウで、[URL 書き換え] アイコンが選択されています。
  4. 右側の [操作] ウィンドウで、[ルールの追加...] をクリックします。 [ルールの追加] ダイアログで、[送信規則] カテゴリの下にある [空の規則] を選択し、[OK] をクリックします。
    [ルールの追加] ダイアログのスクリーンショット。[送信ルール] カテゴリの下にある空白のルールが選択されています。[操作] ウィンドウの [ルールの追加] が強調表示されています。

ここで、実際の送信規則を定義する必要があります。 URL 書き換えモジュール 2.0 では、次の情報を指定して送信書き換え規則を定義します。

  • ルールの名前。
  • このルールを応答に適用するかどうかを制御する省略可能な前提条件。
  • 応答内の文字列の照合に使用するパターン。
  • オプションの条件のセット。
  • パターンが一致し、すべての条件チェックが成功した場合に実行するアクション。

規則の名前付け

[名前] テキスト ボックスに、ルールを一意に識別する名前を入力します (例: "アプリケーション プレフィックスの追加")。

前提条件の定義

前提条件は、応答に対して送信ルールの評価を実行する必要があるかどうかを評価するために使用されます。 たとえば、HTML コンテンツを変更するルールの場合、コンテンツ タイプ ヘッダーが "text/html" に設定された HTTP 応答のみを、このルールに対して評価する必要があります。 送信ルールの評価とコンテンツの書き換えは、WEB アプリケーションのパフォーマンスに悪影響を与える可能性のある CPU 負荷の高い操作です。 そのため、前提条件を使用して、送信規則が適用されるケースを絞り込みます。

作成するルールは HTML 応答にのみ適用する必要があるため、HTTP 応答ヘッダー のコンテンツ タイプ が "text/html" と等しいかどうかをチェックする前提条件を定義します。

前提条件を定義するには:

  1. [事前条件] ボックスの一覧で、[<新しい事前条件の作成...>] を選択します。

  2. これにより、[事前条件エディター] ダイアログが表示され、前提条件を定義する必要があります。 前提条件の設定を次のように指定します。

    • 名前: "IsHTML"

    • 使用: "正規表現"

    • [追加] をクリックして、[条件の追加] ダイアログを表示します。 このダイアログで、次の項目を指定します。

      • 条件入力: "{RESPONSE_CONTENT_TYPE}"

      • 入力文字列が "パターンと一致する" かどうかを確認する

      • パターン: "^text/html"

        [事前条件の追加] ダイアログ ボックスのスクリーンショット。RESPONSE CONTENT TYPE は、入力列に書き込まれます。Type 列に書き込まれるパターンに一致します。テキストスラッシュ h t m l はパターン列に書き込まれます。

  3. [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 からアプリケーション フォルダーをキャプチャする条件パターンを定義して、ルールが応答のリンクを書き換えるときに再利用できるようにします。

  1. 条件グループ ボックスを展開します。
  2. [追加]をクリックします。ボタンをクリックすると、条件を定義するためのダイアログ ボックスが表示されます。
  3. "Condition input:" には、"{URL}" という文字列を入力します。 これにより、Web クライアントによって要求された URL パスを使用するように URL 書き換えモジュールが構成されます。
  4. ドロップダウン コンボ ボックスで、[パターンに一致する] を選択します。
  5. ^/(webmail|payroll)/.*] ボックスに「」と入力します。 この正規表現は、 /webmail または /payrollで始まる URL パスを照合するために使用されます。 パターン内のかっこは、置換 URL を構築するときに使用できるように、一致する URL 文字列の一部をキャプチャします。
  6. [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 応答内のリンクが変更されていることがわかります。

リバース プロキシ テスト ページ ウェブ メール アプリケーションのスクリーンショット。下部のリンクは、h t t p コロン スラッシュ スラッシュ ローカルホスト スラッシュ ウェブ メール スラッシュ デフォルト ドット a s p x です。

まとめ

このチュートリアルでは、リバース プロキシ シナリオを実装するように URL 書き換えモジュールとアプリケーション要求ルーティングを構成する方法について説明しました。 また、URL 書き換えモジュール 2.0 の新しい送信書き換え機能を使用して、Web クライアントにサービスを提供する前に、アプリケーションの応答のリンクを修正する方法についても学習しました。

リバース プロキシを使用する場合、多くの場合、HTTP 応答ヘッダーの書き換えも必要になることに注意してください。 URL 書き換えモジュール 2.0 を使用して応答 HTTP ヘッダーを変更する方法については、「 HTTP 応答ヘッダーの変更」を参照してください。