URL 書き換えモジュールでのカスタム書き換えプロバイダーの使用
作成者: Ruslan Yakushev
このチュートリアルでは、URL 書き換えモジュール 2.0 とともにカスタム書き換えプロバイダーを使用する方法について説明します。 このチュートリアルでは、URL Rewrite 2.0 機能拡張サンプルを使用します。このサンプルは、MSDN コード ギャラリーの URL 書き換え機能拡張サンプルからダウンロードできます。
URL 書き換え機能拡張サンプルのインストール
このチュートリアルを完了するには、URL 書き換え機能拡張サンプル (https://www.microsoft.com/download/details.aspx?id=43353
) をダウンロードしてインストールします。 機能拡張サンプルのインストール パッケージには、.NET アセンブリと、最も一般的な 3 つのユース ケースのための書き換えプロバイダーの完全な実装を含むソース コードが含まれています。
- 書き換えマッピングまたはリダイレクト マッピングを SQL データベースに格納する。
- 書き換えマッピングまたはリダイレクト マッピングをテキスト ファイルに格納する。
- テキスト ファイルに検索部分文字列を格納する。
インストール中に、カスタム セットアップで [ランタイム] オプションを選択してください。 これにより、サンプル プロバイダーが .NET グローバル アセンブリ キャッシュに登録され、URL 書き換えモジュールで使用できるようになります。
プロバイダーの登録
インストール パッケージには、次の 3 つの書き換えプロバイダーが含まれています。
- DbProvider - このプロバイダーを使用して、ストアド プロシージャを実行することで、SQL Server データベース テーブルから書き換えマッピングを取得できます
- FileMapProvider - このプロバイダーを使用して、テキスト ファイルに格納されている書き換えマッピングを取得できます
- FileContainsProvider - このプロバイダーを使用して、テキスト ファイル内の文字列がプロバイダーの入力文字列の部分文字列であるかどうかを確認できます。
書き換えルールでサンプル プロバイダーを使用するには、プロバイダーを IIS に登録する必要があります。 プロバイダーを登録するには、IIS マネージャーのユーザー インターフェイスを使用します。
- IIS マネージャーで URL 書き換え機能を開きます。
- 右側の [操作] ウィンドウで、[View Providers...]\(プロバイダーの表示...\) 操作を選択します。
- [操作] ウィンドウで、[Add Provider...]\(プロバイダーの追加...\) 操作を選択します。
- [Add Provider]\(プロバイダーの追加\) ダイアログで、書き換えルールからこのプロバイダーを参照するときに使用する名前を入力します。
- その後、[Managed Type]\(マネージドの種類\) ドロップダウン リストで、プロバイダーに対応する .NET の種類を選択します。 プロバイダーの種類が表示されるまでに時間がかかる場合があることに注意してください。
- 上記の手順を繰り返して、3 つのプロバイダーをすべて登録します。
DbProvider の使用
DbProvider を使用するには、Microsoft SQL Server にアクセスする必要があります。 プロバイダーは SQL Server データベースに接続し、入力 URL 文字列を含む NVARCHAR 入力パラメーターを受け取り、NVARCHAR 型の出力 URL 文字列を含む 1 行の結果セットを返すストアド プロシージャを実行します。
サンプル データベースの作成
SQL Server Management Studio を開き、新しいクエリ ウィンドウを開き、次の SQL スクリプトを実行します。
USE [master]
CREATE LOGIN [IIS APPPOOL\DefaultAppPool] FROM WINDOWS WITH DEFAULT_DATABASE=[master]
CREATE DATABASE [RewriteDB]
GO
USE [RewriteDB]
GO
CREATE TABLE [dbo].[RewriteTable](
[OriginalUrl] [nvarchar](256) NOT NULL,
[NewUrl] [nvarchar](256) NOT NULL
) ON [PRIMARY]
GO
CREATE PROCEDURE [dbo].[GetRewrittenUrl]
@input nvarchar(256)
AS
SELECT rt.NewUrl
FROM dbo.RewriteTable rt
WHERE rt.OriginalUrl = @input
GO
CREATE USER [IIS APPPOOL\DefaultAppPool] FOR LOGIN [IIS APPPOOL\DefaultAppPool]
GRANT EXECUTE ON dbo.GetRewrittenUrl TO [IIS APPPOOL\DefaultAppPool];
GO
INSERT INTO dbo.RewriteTable VALUES ('old/catalog/product.html', 'new/category/product.html');
INSERT INTO dbo.RewriteTable VALUES ('old/contactus/index.html', 'new/contactus.html');
GO
上記のスクリプトでは、RewriteDB という名前の新しいデータベースが作成されます。このデータベースには、テーブル RewriteTable とストアド プロシージャ GetRewrittenURL があります。 また、そのストアド プロシージャを実行するためのアクセス許可を IIS APPPOOL\DefaultAppPool アカウントに付与します。 また、2 つの URL マッピングを使用して、データベース テーブルに入力します。
DbProvider 設定の構成
ストアド プロシージャを呼び出す DbProvider インスタンスを構成します。
- IIS マネージャーの URL 書き換え機能ビューで、[操作] ウィンドウの [View Providers...]\(プロバイダーの表示\) を選択します。
- [Add Provider]\(プロバイダーの追加\) を選択し、[DbProvider] を選択します。 DB という名前を付けます。これは、書き換えルールからプロバイダーを参照する名前になります。
- DB という名前の DbProvider インスタンスを選択し、[Add Provider Setting...]\(プロバイダー設定の追加...\) 操作をクリックします。
- [Edit Provider Setting]\(プロバイダー設定の編集\) ダイアログを使用して、プロバイダーを構成します。
プロバイダー設定には、次の値を使用します。
- SQL Server 接続文字列: 次の例のような SQL Server 接続文字列を指定します。
"Data Source=servername\sqlexpress;Initial Catalog=RewriteDB;Integrated Security=True" - ストアド プロシージャ名: GetRewrittenUrl
- キャッシュ間隔 (分): SQL テーブルの値が変化しない場合は 0 に設定します。それ以外の場合は正の整数に設定して、プロバイダーがモジュールの内部書き換えキャッシュを定期的に更新するようにします。 指定しない場合、値は 0 とみなされます。
書き換えルールからの DbProvider の呼び出し
Web サイトのルート ディレクトリで、web.config ファイルを開きます。 IIS の既定の Web サイトを使用する場合は、ファイルが C:\inetpub\wwwroot\
フォルダーに配置されている必要があります。
次のリダイレクト ルールを /<configuration>/<system.webServer>/<rewrite>/<rules>
要素内の web.config ファイルに貼り付けます。
<rule name="DbProviderTest" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{DB:{R:1}}" pattern="(.+)" />
</conditions>
<action type="Redirect" url="{C:1}" />
</rule>
web.config ファイルの内容は次のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<providers>
<provider name="DB" type="DbProvider, Microsoft.Web.Iis.Rewrite.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
<settings>
<add key="ConnectionString" value="Data Source=ruslany-server\sqlexpress;Initial Catalog=RewriteDB;Integrated Security=True" />
<add key="StoredProcedure" value="GetRewrittenUrl" />
<add key="CacheMinutesInterval" value="0" />
</settings>
</provider>
</providers>
<rules>
<rule name="DbProviderTest" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{DB:{R:1}}" pattern="(.+)" />
</conditions>
<action type="Redirect" url="{C:1}" />
</rule>
</rules>
</rewrite>
このルールは、DbProvider を介して SQL Server データベースから取得された URL への HTTP リダイレクトを実行します。 "DB" という名前の DbProvider インスタンスがルールの条件から呼び出され、プロバイダーから返された結果が空でない場合は、HTTP リダイレクトが実行されます。
このルールをテストするには、Web ブラウザーを開き、http://localhost/old/catalog/product.html
または http://localhost/old/contactus/index.html
への要求を行います。 RewriteDB データベース テーブルで定義されているリダイレクト マッピングに基づいて、ブラウザーが新しい URL にリダイレクトされます。 Web サーバーは、リダイレクトされた URL に対して HTTP 404 エラーを返します。これは、サーバー上にそのようなファイルまたはディレクトリがないためですが、このチュートリアルの目的には関係ありません。 重要なのは、Web サーバーが DbProvider を使用するルールに基づいてリダイレクト応答を発行した点です。
FileMapProvider の使用
FileMapProvider は、テキスト ファイルから URL マッピングを読み取ります。 書き換えマップ エントリの量が非常に多く、web.config ファイルに保持することが実用的でない場合は、組み込みの書き換えマップ機能の代わりにこれを使用できます。
サンプル マッピング ファイルの作成
Web サイトのルート ディレクトリに App_Data という名前の新しいディレクトリを作成します。 そのディレクトリに、redirectmappings.txt というテキスト ファイルを作成します。 次の行をファイルに追加します。
old/catalog/product.html, new/category/product.html
old/contactus/index.html, new/contactus.html
WARNING:テキスト ファイルに Web から直接アクセスできないようにしてください。 IIS 要求のフィルタリング モジュールを使用するか、ファイルを App_Data フォルダー内に配置して、HTTP クライアントがこのファイルのコンテンツに直接アクセスできないようにします。
FileMapProvider の構成
DbProvider の構成の説明と同じ手順に従って、FileMapProvider を構成します。 プロバイダー設定には、次の値を使用します。
- FilePath: {DOCUMENT_ROOT}\App_Data\redirectmappings.txt (ファイル パスでの {DOCUMENT_ROOT} の使用に注意してください。これは、プロバイダーの初期化中に実際のパスに置き換えられます。これは、web.config ファイルに絶対ファイル パスを含めたくない場合に便利です)
- IgnoreCase: 1
- 区切り文字: "," (指定されていない場合は、TAB 記号が区切り文字として使用されます)
書き換えルールからの FileMapProvider の呼び出し
Web サイトのルート ディレクトリで、web.config ファイルを開きます。 IIS の既定の Web サイトを使用する場合は、ファイルが C:\inetpub\wwwroot\
フォルダーに配置されている必要があります。
次のリダイレクト ルールを /<configuration>/<system.webServer>/<rewrite>/<rules>
要素内の web.config ファイルに貼り付けます。
<rule name="FileMapProviderTest" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{FileMap:{R:1}}" pattern="(.+)" />
</conditions>
<action type="Redirect" url="{C:1}" />
</rule>
web.config ファイルの内容は次のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<providers>
<provider name="FileMap" type="FileMapProvider, Microsoft.Web.Iis.Rewrite.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
<settings>
<add key="FilePath" value="{DOCUMENT_ROOT}\App_Data\redirectmappings.txt" />
<add key="IgnoreCase" value="1" />
<add key="Separator" value="," />
</settings>
</provider>
</providers>
<rules>
<rule name="FileMapProviderTest" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{FileMap:{R:1}}" pattern="(.+)" />
</conditions>
<action type="Redirect" url="{C:1}" />
</rule>
</rules>
</rewrite>
このルールは、FileMapProvider 経由でテキスト ファイルから取得された URL への HTTP リダイレクトを実行します。 "FileMap" という名前の FileMapProvider インスタンスがルールの条件から呼び出され、プロバイダーから返された結果が空でない場合は、HTTP リダイレクトが実行されます。
このルールをテストするには、Web ブラウザーを開き、http://localhost/old/catalog/product.html
または http://localhost/old/contactus/index.html
への要求を行います。 ブラウザーは、redirectmappings.txt ファイルで定義されているリダイレクト マッピングに基づいて新しい URL にリダイレクトされます。 Web サーバーは、リダイレクトされた URL に対して HTTP 404 エラーを返します。これは、サーバー上にそのようなファイルまたはディレクトリがないためですが、このチュートリアルの目的には関係ありません。 重要なのは、Web サーバーが FileMapProviders を使用するルールに基づいてリダイレクト応答を発行した点です。
FileContainsProvider の使用
FileContainsProvider は、テキスト ファイルから文字列のセットを読み取り、プロバイダーの入力文字列にそれらの文字列のいずれかが部分文字列として含まれているかを確認します。 プロバイダーは、たとえば、ユーザー エージェント ヘッダーに基づいてアクセスをブロックする書き換えルールで使用できます。
サンプルの許可されていないユーザー エージェント ファイルの作成
Web サイトのルート ディレクトリに App_Data という名前の新しいディレクトリを作成します。 そのディレクトリに、disalloweduseragents.txt というテキスト ファイルを作成します。 次の行をファイルに追加します。
badrobot1
badrobot2
WARNING:テキスト ファイルに Web から直接アクセスできないようにしてください。 IIS 要求のフィルタリング モジュールを使用するか、ファイルを App_Data フォルダー内に配置して、HTTP クライアントがこのファイルのコンテンツに直接アクセスできないようにします。
FileContainsProvider の構成
DbProvider の構成の説明と同じ手順に従って、FileMapProvider を構成します。 プロバイダー設定には、次の値を使用します。
- FilePath: {DOCUMENT_ROOT}\App_Data\disalloweduseragents.txt (ファイル パスでの {DOCUMENT_ROOT} の使用に注意してください。これは、プロバイダーの初期化中に実際のパスに置き換えられます。これは、web.config ファイルに絶対ファイル パスを含めたくない場合に便利です)
- IgnoreCase: 1
書き換えルールから FileContainsProvider を呼び出す
Web サイトのルート ディレクトリで、web.config ファイルを開きます。 IIS の既定の Web サイトを使用する場合は、ファイルが C:\inetpub\wwwroot\
フォルダーに配置されている必要があります。
次のリダイレクト ルールを /<configuration>/<system.webServer>/<rewrite>/<rules>
要素内の web.config ファイルに貼り付けます。
<rule name="FileContainsProviderTest" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{FileContains:{HTTP_USER_AGENT}}" pattern=".+" />
</conditions>
<action type="AbortRequest" />
</rule>
web.config ファイルの内容は次のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<providers>
<provider name="FileContains" type="FileContainsProvider, Microsoft.Web.Iis.Rewrite.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
<settings>
<add key="FilePath" value="{DOCUMENT_ROOT}\App_Data\disalloweduseragents.txt" />
<add key="IgnoreCase" value="1" />
</settings>
</provider>
</providers>
<rules>
<rule name="FileContainsProviderTest" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{FileContains:{HTTP_USER_AGENT}}" pattern=".+" />
</conditions>
<action type="AbortRequest" />
</rule>
</rules>
</rewrite>
HTTP 要求のユーザー エージェントが、disalloweduseragents.txt ファイルにリストされている文字列のいずれかに一致する場合、このルールは HTTP 接続を中止します。 "FileContains" という名前の FileContainsProvider インスタンスがルールの条件から呼び出され、プロバイダーから返された結果が空でない場合、HTTP 接続は中止されます。
ルールをテストするには、WFetch を開き、次のように user-agent ヘッダーを要求に追加します。
user-agent: badrobot1\r\n
WFetch から http://localhost/test/
に要求を行います。 ユーザー エージェント文字列が disalloweduseragents.txt ファイル内のいずれかの文字列と一致したため、接続が中止されます。