IIS Rewriteでカスタムモジュールを作る

過去のブログのアーカイブ
この記事は前身のブログのアーカイブを引き継いだものです. 画像が正しく表示できないなど,コンテンツの表示に問題がある恐れがあります.

案外資料が少ないのか、英語ページは出てくるのですが日本語ページは出てこない。
しかも英語ページでもところどころ抜けている部分があるといいますか…私がかなり躓いてしまったポイントなので息抜きのついでに記事にまとめておこうと思います。

カスタムモジュールの作成

プロジェクトの作成

一番肝心なところのカスタムモジュールの作成ですね。
開発言語はC#でもVBでも大丈夫みたいです。私はC#(.NET Framework 3.5)で作りました。インストールされていないと動作しないかもしれませんが。
create-porject-dll
 
作成したらIIS Rewrite Moduleの中に同梱されているdllファイルうぃ引っ張ってきます。
サーバー側のPCにて「C:\Program Files\Reference Assemblies\Microsoft\IIS」を開いてください。その中にあるMicrosoft.Web.Iis.Rewrite.dllを引っ張ってきます。

dllのインポート/インターフェースの実装

先ほど引っ張ってきたdllファイルを参照設定に指定してあげてください。
reference-iis-rewrite
適当にクラスを作り、”Microsoft.Web.Iis.Rewrite.IRewriteProvider”を実装します。
今回は設定項目は作らず、ただリライトさせるだけのクラスを作りたいと思います。
こんな感じでインターフェースを実装します。

public class SSession : IRewriteProvider
{
    public void Initialize(IDictionary<string, string> settings, Microsoft.Web.Iis.Rewrite.IRewriteContext rewriteContext) {
        return;
    }
    public string Rewrite(string value) {
    }
}

 リライト条件を書く

ここは各自でお任せします。valueが要求されたURL、そして戻り値に書き換え条件を指定してあげるだけでいいです。
例えばすべての要求をhoge.htmlにしたいなら

return "hoge.html";

とすればいいだけです。

ビルド

はい、ここが私の一番つまずいたポイントです。
まず.Net Frameworkのバージョンについてですが、4.0できちんと動作しているのか怪しいです。
というのもGACインストール時に4.0以降と3.5以前で場所が変わったので…
なので私はとりあえず.NET Framework 3.5でビルド。4.0でもできた方がいるなら報告お願いします。
あとプラットフォームの設定ですが、Any CPUじゃないとエラーが起きるみたいです。
規定値なので変更しなければいいだけです
あとは署名設定。これも必須です。パスワードは必要ないので適当に設定してあげましょう。
ちなみにこれがないとそもそもIIS Rewrite Moduleに認識してくれないです。
signature

サーバーへインストール!

GACへインストール

次はGACへのインストールです。
面倒なのでGACインストールを自動化するアプリ作りました。
こちらに公開しているのでどうぞ。
GACへインストールを作ってみた。
http://yryr.me/programming/update/gac-insutall-no-gacutil.html
こちらのアプリを使用する場合。インストールするdllをインストールするだけで可能です。
また、再インストールの場合は一度、アンインストール→インストールの手順でお願いします。

カスタムプロバイダの指定

まず「URLの書き換え」の画面へ行ってください。
右側のメニューにプロバイダの表示というものがあるのでそれをクリック。
view-provider
それから再び右側のメニューの「プロバイダの追加」を選択。
先ほどGACにインストールしたdllファイルが表示されると思うので選択。名前はなんでもいいですが英語オンリーでお願いします。
add-provider
 
そして前の画面に戻り、いつものように「規則の追加」を選択します。
add-rewrite-role
 
名前はご自由にどうぞ。パターンにはとりあえずテストとして「(.+)」と指定しましょう。
一番大事なのが一番したのアクションのところ。
アクションの種類は「書き換え」に、URLの書き換えのところには、プロバイダの指定して設定した名前にしましょう

rewrite-action

前画面でSecureになっているのにこの画面ではCustomになっているのはミスです。同じものにしてあげてください。

と、これで完了です。

そもそもの使い道

このようなカスタムモジュールを作ってまで書き換えしないと行けない状況ってなんなんでしょうね。
大体のものならrewrite.aspxとか作ってあげてそこで書き換え条件を指定してあげればいいだけなんでしょうけど
…と思ってたのですが私にもこのようなものを作る必要が出てくる場面ができてしまいまして;;
データベースを扱って条件分岐をさせる。その時にPOSTにまで対応させようとなると、rewrite.aspxみたいな書き換えは通用しないんですね。ViewStateのせいで。
背景に複雑な理由があるときにのみ使いたいと思います。サーバーにも負担が掛かりそうなので。

再インストールについて

ここが私が一番躓いたところなのですが、カスタムモジュールを編集した後、再び再インストールしてあげるときに、何故かファイルが置き換わらない…?ということが
GACとサーバー側のキャッシュに問題があるようで、GACは必ずアンインストールしてからインストールすること。
変更してあげたあとはアプリケーションプールの再起動が必要となります。
これにわからず何度やっても状況が変わらないってことが…
サーバーはあらゆるものをキャッシュするのでその辺り気にしてあげる必要があるみたいです。