ARRでリダイレクトのURLを書き換える - ARRで相対URLのリダイレクトで正しくないURLにリダイレクトされる
Application Request Routing (ARR) を利用してWebアプリケーションを動作させた際に、相対ディレクトリのリダイレクトがうまく動作しない問題に対処する方法を紹介します。
概要
ARRでURLを書き換えてWebアプリを実行した際に、Webアプリでリダイレクトが発生すると、リダイレクト先が相対ディレクトリの場合、本来リダイレクトされるページと違うページにリダイレクトされWebアプリが正しく動作しません。この問題を解決するためには、相対ディレクトリのリダイレクトのURLを書き換えて外部から見える正しいURLにリダイレクトさせる必要があります。
動作の詳細
利用者がWebブラウザで
http://abc.ipentec.com/app1/
にアクセスする場合を考えます。ARRを導入しているリバースプロキシでURLの書き換えを実施し、
http://abc.ipentec.com/app1/
を
http://192.168.nnn.mmm/prog/myapp01
に書き換え、192.168.nnn.mmmのサーバーのコンテンツを取得します。
通常の動作であれば、192.168.nnn.mmm のレスポンスがWebブラウザに返されページが表示できます。
Webアプリ側でリダイレクトされる場合を考えます。Webアプリのサーバーではアプリケーションのルートは
/prog/myapp01
になっています。この時相対ディレクトリのリダイレクトで
/prog/myapp01/list
にリダイレクトされる場合を考えます。リダイレクトのURLはレスポンスヘッダのLocationに設定され、通常はそのまま端末に返されます。
端末はアクセスしたホストに対しての相対URLと判断するため、
http://abc.ipentec.com/prog/myapp01/list
にアクセスしようとします。
http://abc.ipentec.com/prog/myapp01/list
にアクセスすると、
http://abc.ipentec.com/app1/
がURL書き換え対象のため、全く違うURLのアクセスとなり、書き換えルールが存在しないためアクセスできません。このため、404 Not Found などのエラーが返されます。
対処法
正しく動作させるためには、ARRのリバースプロキシサーバーでリダイレクトのレスポンスヘッダのLocationのURLを書き換える必要があります。
レスポンスヘッダのLocationのURLを外部から見えるURLの相対ディレクトリに書き換えれば、アクセス元のWebブラウザでも正しいURLにリダイレクトできます。
設定手順
今回は以下のアプリケーションのリダイレクトの設定をします。
公開されているURL | 内部のサーバーのURL |
http://***.ipentec.com/myapp01/ | http://192.168.*.*/app/MyApp01/ |
インターネット インフォメーション サービス(IIS) マネージャーを開き、左側のツリービューで設定したいサイトをクリックして選択し、右側のエリアの[URL]書き換え
をダブルクリックして[URL 書き換え]画面を表示します。
下図の画面が表示されます。初めに書き換えの条件を設定します。今回はレスポンスコードが
301
302
のリダイレクトの場合に書き換えを実行したいので、レスポンスコードが
3nn
となる場合の条件を作成します。右側の[操作]エリアの[必須条件の表示]リンクをクリックします。
[送信規則の必須条件]の画面が表示されます。右側の[操作]エリアの[追加]リンクをクリックします。
[必須条件の追加]ダイアログが表示されます。[名前]のテキストボックスに条件名(任意)を入力します。続いて大ログ下部の[論理グループ化]セクションの
右側にある[追加]ボタンをクリックします。
[条件の追加]ダイアログが表示されます。
[条件の入力]のテキストボックスがデフォルトでは
{RESPONSE_CONTENT_TYPE}
が入力されていますが、こちらを
{RESPONSE_STATUS}
に変更します。
[入力文字列が次の条件を満たしているかどうかをチェック]のコンボボックスは"パターンに一致する"を選択します。
[パターン]のテキストボックスには
3\d\d
を入力します。 (正規表現で301レスポンスや、302レスポンスをマッチできれば良いので、
3[0-9][0-9]
の入力でも良いです。)
入力ができたらダイアログ下部の[OK]ボタンをクリックしてダイアログボックスを閉じます。
[必須条件の追加]ダイアログボックスに戻ると、論理グループ化のリストに、先ほど作成した条件が追加されています。
ダイアログボックスの[OK]ボタンをクリックしてダイアログを閉じます。
インターネット インフォメーション サービス(IIS) マネージャーのウィンドウに戻ります。[送信規則の必須条件]画面のリストに先ほど作成した必須条件が追加されています。
右側の[操作]エリアの[規則に戻る]リンクをクリックします。
[URL 書き換え]画面に戻ります。続いて、URLの書き換えルールを作成します。右側の[操作]エリアの[規則の追加]ボタンをクリックします。
[規則の追加]ダイアログが表示されます。[送信規則]セクションの[空の規則]をクリックして選択します。選択後[OK]ボタンをクリックします。
インターネット インフォメーション サービス(IIS) マネージャーのウィンドウが[送信規則の編集]表示に変わります。
[名前]テキストボックスに送信規則の名前を設定します(任意の名前)。
[必須条件]のコンボボックスを開きます。先ほど"必須条件の追加"作成した条件がドロップダウンリストの表示されますのでクリックして選択します。
[一致]セクションの[一致するスコープ]コンボボックスを開きます。リストの"サーバー変数"をクリックして選択します。
選択すると下図の状態に変わります。
[変数名]のテキストボックスに
RESPONSE_Location
を入力します。また[パターン]のテキストボックスに
^/app/MyApp01/(.*)
を入力します。
[アクション]のセクションの[アクションのプロパティ]の[値]のテキストボックスに
/myapp01/{R:1}
を入力します。また、[既存のサーバー変数値を置き換える]
チェックボックスにチェックを付けます。
設定を入力後、右側の[操作]エリアの[適用]リンクをクリックします。
[HTTP 応答のヘッダーまたはコンテンツに適用される通信規則]のリストに作成した規則が追加されます。
設定ができたらWebブラウザでアクセスし、リダイレクトが正しく動作するか確認します。
Tips
リダイレクトなどの動作を書き換えるための設定が煩雑になるようであれば、URLの相対ディレクトリの階層とディレクトリ名称を
コンテンツサーバーのディレクトリとそろえておけば、レスポンスヘッダのコンテンツ書き換えは不要にできます。
著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。