URL Rewrite Module の書き換えルールを作成する
作成者: Ruslan Yakushev
URL 書き換えモジュールは、スタンドアロンの IIS サーバー用にダウンロードして入手できる IIS の拡張機能です。また、Windows Azure Web Sites (WAWS) 上のすべての Web サイトにプレインストールされ、使用できるようになっています。 このチュートリアルでは、URL 書き換えモジュールの一連の書き換え規則を作成してテストする方法について説明します。
前提条件
このチュートリアルでは、次の前提条件が必要です。
- ASP.NET 役割サービスが有効になっている IIS 7 以上。
- URL 書き換えモジュールがインストールされている。 詳細については、「URL 書き換えモジュールの使用」を参照してください。
テスト Web ページの設定
URL 書き換えモジュールがどのように機能するかを示すために、単純なテスト ASP.NET ページを使用します。 このページは、Web サーバー変数を読み取り、その値をブラウザーに出力します。
次の ASP.NET コードをコピーし、%SystemDrive%\inetpub\wwwroot\ フォルダー内の article.aspx というファイルに配置します。
<%@ 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>URL Rewrite Module Test</title>
</head>
<body>
<h1>URL Rewrite Module Test Page</h1>
<table>
<tr>
<th>Server Variable</th>
<th>Value</th>
</tr>
<tr>
<td>Original URL: </td>
<td><%= Request.ServerVariables["HTTP_X_ORIGINAL_URL"] %></td>
</tr>
<tr>
<td>Final URL: </td>
<td><%= Request.ServerVariables["SCRIPT_NAME"] + "?" + Request.ServerVariables["QUERY_STRING"] %></td>
</tr>
</table>
</body>
</html>
このファイルをコピーしたら、http://localhost/article.aspx
を参照し、ブラウザーでページが正しくレンダリングされたことを確認します。
書き換え規則の作成
次の形式を使用して、URL を書き換える単純な書き換え規則を作成します。
http://localhost/article/342/some-article-title
この行を次のように変更します。
http://localhost/article.aspx?id=342&title=some-article-title
.
IIS マネージャーで URL 書き換え UI を使用して書き換え規則を作成します。 これを行うには、次の手順を実行します。
- IIS マネージャーに移動します。
- [Default Web Site] を選択します。
- [機能ビュー] で、[URL 書き換え] をクリックします。
- 右側の [操作] ウィンドウで、[規則の追加...] をクリックします。
- [規則の追加] ダイアログ ボックスで、[空の規則] を選び、[OK] をクリックします。
ここで、実際の書き換え規則を定義する必要があります。 URL 書き換えモジュールでは、次の 4 つの必要な情報を指定して書き換え規則を定義します。
- ルールの名前。
- URL 文字列の照合に使用するパターン。
- 省略可能な一連の条件。
- パターンが一致し、すべての条件チェックが成功した場合に実行するアクション。
規則の名前付け
[名前] テキスト ボックスに、規則を一意に識別する名前を入力します (例: "article.aspx への書き換え")。
パターンの定義
[パターン] テキスト ボックスに、次の文字列を入力します。
^article/([0-9]+)/([_0-9a-z-]+)
この文字列は、パターンが、以下の条件を満たす URL 文字列と一致することを指定する正規表現です。
- "article/" という文字列で始まる。
- 最初の "/" の後に 1 つ以上の数字が含まれる。
- 2 番目の "/" の後に、1 つ以上の英数字または "_" または "-" 文字が含まれる。
正規表現の特定の部分がかっこ内にあることに注目してください。 これらのかっこによってキャプチャ グループが作成され、後で逆参照を使用して規則内で参照できます。
アクションの定義
作成している規則は URL を書き換えることを目的としているため、[アクション] グループ ボックス内の一覧にある [書き換え] アクションの種類を選びます。 [書き換え URL:] テキスト ボックスに、次の文字列を入力します。
article.aspx?id={R:1}&title={R:2}
この文字列は、入力 URL を書き換える新しい値を指定します。 クエリ文字列パラメーターの値に {R:1} と {R:2} を使用しています。これらは、規則パターン内でかっこを使用して定義したキャプチャ グループへの逆参照です。
その他の設定はすべて既定値のままにします。 [受信規則の編集] プロパティ ページは、次のページのようになります。
右側にある [適用] をクリックして、規則を保存します。
構成ファイルでの書き換え規則の表示
書き換え規則は、ApplicationHost.config ファイルまたは Web.config ファイルに格納されます。 作成した規則の構成を確認するには、%SystemDrive%\inetpub\wwwroot にある Web.config ファイルを開きます。 このファイルには、この規則定義を含む <rewrite>
セクションが示されます。
<rewrite>
<rules>
<rule name="Rewrite to article.aspx">
<match url="^article/([0-9]+)/([_0-9a-z-]+)" />
<action type="Rewrite" url="article.aspx?id={R:1}&title={R:2}" />
</rule>
</rules>
</rewrite>
上記の構文は、Windows Azure Web Sites (WAWS) の Web.config で URL 書き換えの構成にも適用されます。
書き換え規則のテスト
規則によって URL が正しく書き換えられることをテストするには、Web ブラウザーを開き、次の URL を要求します。
http://localhost/article/234/some-title
Web サーバー上の書き換え規則によって元の URL が Article.aspx に変更され、クエリ文字列パラメーターの値として "234" と "some-title" が渡されていることがわかります。
リダイレクト規則の作成
これから、次の形式のすべての URL をリダイレクトするリダイレクト規則を作成します。
http://localhost/blog/some-other-title/543
次の形式にします。
http://localhost/article/543/some-other-title
リダイレクト規則を使用すると、複数の URL が 1 つの Web ページを指すようにすることができます。
これを行うには、IIS マネージャーで URL 書き換えの機能ビュー UI を開きます。 [規則の追加…] をクリックし、[空の規則] テンプレートをもう一度選択します。
[規則の編集] ページ内で、次のように入力します。
- 名前: ブログからリダイレクト (これは規則の一意の名前です。)
- パターン: ^blog/([_0-9a-z-]+)/([0-9]+) (このパターンは、"blog" で始まる URL 文字列と一致し、その URL の 2 番目と 3 番目のセグメントを逆参照に取り込みます。)
- アクション: リダイレクト (リダイレクト アクションによってリダイレクト応答がブラウザーに返されます。)
- リダイレクト URL: article/{R:2}/{R:1} (この置換文字列は、リダイレクト URL として使用されます。逆参照を使用して、パターン照合時に取り込まれた元の URL 各部の保持と再配置が行われます。)
以下に示すように、名前、パターン、アクションを入力します。
以下のようにリダイレクト URL を入力します。
その他の設定はすべて既定値のままにします。 右側にある [適用] をクリックして、規則を保存します。
リダイレクト規則のテスト
規則によって要求が正しくリダイレクトされることをテストするには、Web ブラウザーを開き、次の URL を要求します。
http://localhost/blog/some-other-title/323
リダイレクト規則の実行の結果として、ブラウザーが http://localhost/article/323/some-other-title
にリダイレクトされ、前に作成した書き換え規則に従って要求が書き換えられたことがわかります。
アクセス ブロック規則の作成
作成する 3 番目の規則は、Web サイトに対して行われた要求にホスト ヘッダーが設定されていない場合に、そのような要求をすべてブロックするために使用されます。 この種の規則は、ホスト名を使用する代わりに、サーバーの IP アドレスに対して HTTP 要求を発行して行われるハッキングの試みを阻止する際に有用です。
IIS マネージャーを使用せずにこの規則を作成します。 この記事の前半で article.aspx テスト ファイルのために使用した %SystemDrive%\inetpub\wwwroot\
フォルダー内の Web.config ファイルを開きます。 <rewrite>
セクションを見つけます。 次の規則を <rules> コレクションに挿入して、このコレクション内の最初の規則にします。
<rule name="Fail bad requests">
<match url=".*"/>
<conditions>
<add input="{HTTP_HOST}" pattern="localhost" negate="true" />
</conditions>
<action type="AbortRequest" />
</rule>
<rewrite>
セクションは、次のコードのようになります。
<rewrite>
<rules>
<rule name="Fail bad requests">
<match url=".*"/>
<conditions>
<add input="{HTTP_HOST}" pattern="localhost" negate="true" />
</conditions>
<action type="AbortRequest" />
</rule>
<rule name="Redirect from blog">
<match url="^blog/([_0-9a-z-]+)/([0-9]+)" />
<action type="Redirect" url="article/{R:2}/{R:1}" redirectType="Found" />
</rule>
<rule name="Rewrite to article.aspx">
<match url="^article/([0-9]+)/([_0-9a-z-]+)" />
<action type="Rewrite" url="article.aspx?id={R:1}&title={R:2}" />
</rule>
</rules>
</rewrite>
規則を分析して、その作用を把握しましょう。
<match url=".*"/>
上記の要素は、規則が任意の URL 文字列と一致することを示しています。
<add input="{HTTP_HOST}" pattern="localhost" negate="true" />
上記の要素では、サーバー変数 HTTP_HOST を読み取ってホスト ヘッダー値を取得し、それをパターン "localhost" と照合し、照合の結果を否定する条件を規則に追加します。 つまり、この条件では、ホスト ヘッダーが "localhost" と一致しないことを確認します。
<action type="AbortRequest" />
上記の要素は、HTTP 要求を終了するよう URL 書き換えモジュールに指示します。
アクセス ブロック規則のテスト
この規則をテストするには、Web ブラウザーを開き、http://127.0.0.1/article/234/some-title
への要求を行います。 ブラウザーに、サーバーからの応答を受信していないことが示されるはずです。 一方、http://localhost/article/234/some-title
を要求した場合、Web サーバーは正常に応答します。
失敗した表示は次のようになります。
成功した表示は次のようになります。
まとめ
このチュートリアルでは、IIS マネージャーを使用するか、Web.config ファイルを手動で編集して、URL 書き換え規則を構成する方法について説明しました。 このチュートリアルで作成した規則では、正規表現のサポートや、HTTP ヘッダーとサーバー変数を使用して書き換えの判断を行う機能など、URL 書き換えモジュールの重要な機能の一部を示しました。