URL 書き換えモジュール用の書き換えルールの作成
作成者 : Ruslan Yakushev
発行日 : 2008 年 5 月 19 日 (作業者 : ruslany(英語))
更新日 : 2008 年 11 月 10 日 (作業者 : ruslany(英語))
このチュートリアルは、以下を前提としています。
- ASP.NET 役割サービスを持つ IIS 7.0 が有効化されている。
- URL 書き換えモジュールの Go Live リリースがインストールされている。
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>
<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>
このファイルをコピーした後で、https://localhost/article.aspx を参照して、ページがブラウザーに正しくレンダリングされたことを確認します。
次の形式を使用して URL を書き換える簡単な書き換えルールを作成します。
https://localhost/article/342/some-article-title
は次のように書き換えられます。
https://localhost/article.aspx?id=342&title=some-article-title
IIS マネージャーの URL 書き換え UI を使用して書き換えルールを作成します。これは、次の手順で行います。
- IIS マネージャーに移動します。
- [Default Web Site] を選択します。
- 機能ビューで [URL Rewrite] をダブルクリックします。
- 右側の [操作] ウィンドウで、[Add rules...] をクリックします。
- [Add Rules] ダイアログで、[Blank Rule] を選択して、[OK] をクリックします。
ここで実際の書き換えルールを定義する必要があります。URL 書き換えモジュールで、必要な 4 つの情報を指定して、書き換えルールを定義します。
- ルールの名前
- URL 文字列に一致させるために使用するパターン
- 条件のオプション セット
- パターンが一致し、すべての条件チェックで問題がない場合に実行するアクション
[名前] テキスト ボックスで、「Rewrite to article.aspx」など、ルールを一意に識別する名前を入力します。
[Pattern] テキスト ボックスで、次の文字列を入力します。
^article/([0-9]+)/([_0-9a-z-]+)
この文字列は、次の条件を満たす任意の URL 文字列にパターンが一致することを指定する正規表現です。
- 一続きの文字 "article/" で始める。
- 最初の "/" の後に 1 つまたは複数の数字が含まれる。
- 2 番目の "/" の後に 1 つまたは複数の英数字、または "_" か "-" が含まれる。
正規表現の特定の部分がかっこ内にあることに注意してください。これらのかっこにより、後で逆参照を使用してルール内で参照できるキャプチャ グループを作成します。
作成する規則は URL を書き換えるので、[Action] グループボックスに一覧表示されている [Rewrite] アクション タイプを選択します。[Rewrite URL] テキスト ボックスで、次の文字列を入力します。
article.aspx?id={R:1}&title={R:2}
この文字列では、入力 URL が書き換えられる新しい値を指定します。クエリ文字列パラメーターの値に対して、{R:1} と {R:2} を使用したことに注意してください。{R:1} と {R:2} は、かっこを使用してルール パターンで定義されたキャプチャ グループを逆参照します。
他のすべての設定は、既定値のままにします。[Edit Rule] プロパティ ページは、次のページのようにしてください。
右側の [適用] アクションをクリックしてルールを保存します。
書き換えルールは、aplicationHost.config ファイルか web.config ファイルのいずれかに格納されています。作成したルールの構成を確認するには、%SystemDrive%\inetput\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>
ルールが URL を正しく書き換えていることをテストするには、Web ブラウザーを開いて、次の URL を要求します。
https://localhost/article/234/some-title
Web サーバー上の書き換えルールによって、元の URL が article.aspx に変更され、クエリ文字列パラメーターの値として "234" と "some-title" が渡されています。
ここでは、次の形式のすべての URL をリダイレクトするリダイレクト規則を作成します。
https://localhost/blog/some-other-title/543
これは以下にリダイレクトされます。
https://localhost/article/543/some-other-title
これを実行するには、IIS マネージャーで [URL Rewrite] 機能表示ユーザー インターフェイスを開き、[Add Rules] をクリックして [Blank Rule] テンプレートを再度選択します。
[Edit Rule] ページで、次を入力します。
- 名前 : 「Redirect from blog」(これは規則の一意の名前です)
- Pattern : 「^blog/([_0-9a-z-]+)/([0-9]+)」 (このパターンは、"blog" で始まり、URL の 2 番目と 3 番目のセグメントを逆参照にキャプチャ する URL 文字列と一致します)
- 操作 : 「Redirect」(リダイレクト操作では、リダイレクト応答がブラウザーに返信されます)
- Redirect URL : 「article/{R:2}/{R:1}」(この置換文字列は、リダイレクト URL として使用されます。パターン マッチ中にキャプチャされた元の URL を保持して再配置するために逆参照を使用することに注意してください)
他のすべての設定は、既定値のままにします。[Edit Rule] プロパティ ページは、次のページのように設定してください。
右側の [適用] アクションをクリックしてルールを保存します。
ルールが要求を正しくリダイレクトしていることをテストするには、Web ブラウザーを開いて、次の URL を要求します。
https://localhost/blog/some-other-title/323
リダイレクト ルールの実行の結果として、ブラウザーが https://localhost/article/323/some-other-title にリダイレクトされたこと、前に作成した書き換えルールに従って要求が書き換えられていることを確認してください。
ここで作成する 3 番目のルールを使用して、要求にホスト ヘッダー セットがない場合に Web サイトに対して行われたすべての要求をブロックします。この種類のルールは、ホスト名を使用する代わりに、サーバーの IP アドレスに対して HTTP 要求を発行することで実行されるハッキング攻撃を防止する場合に役に立ちます。
このルールは IIS マネージャーを使用しないで作成します。Web.config ファイルを開いて <rewrite> セクションを検索し、次のルールを挿入してください。
<rule name="Fail bad requests">
<match url=".*"/>
<conditions>
<add input="{HTTP_HOST}" pattern="localhost" negate="true" />
</conditions>
<action type="AbortRequest" />
</rule>
これがコレクションの 1 番目のルールになるように、これを <rules> コレクションに挿入します。<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" />
- この要素は、URL 書き換えモジュールに HTTP 要求を終了することを命じています。
このルールをテストするには、Web ブラウザーを開いて http://127.0.0.1/article/234/some-title に対して要求を行います。ブラウザーには、サーバからの応答がないことを示す画面が表示されます。https://localhost/article/234/some-title を要求すると、Web サーバーは正常に応答します。
このチュートリアルでは、IIS マネージャーを使用することにより、または、web.config ファイルを手動で編集することにより、URL の書き換えルールを構成する方法について説明しました。このチュートリアルで作成されたルールでは、正規表現のサポート、さまざまな種類のアクション、http ヘッダーとサーバー変数を使用して書き換えの決定を行う能力など、URL 書き換えモジュールの重要な機能の一部について説明しました。