Web – IIS7~10でURLの書き換えが可能に

URL Rewrite Module 2.1

server2016、Windows10のIIS10になると、今までの「URL Rewrite Module 2.0」がインストールできなくなります。
これは、2.0のバグで、IISのバージョン10を1.0と判断し9より下として処理するのが原因のようです。
そのため2.0をインストールするには、レジストリのIISのバージョンを9に変えてインストールし、その後10に戻すという方法があります。
IIS10におけるrewrite.dllのインストール

この問題を解消したのが「URL Rewrite Module 2.1」です。
URL Rewrite ダウンロード
下の方に日本語インストーラがあります。
Download URL Rewrite Module 2.1
Japanese: x86 installer / x64 installer

しかし「URL Rewrite Module 2.1」には別の問題があります。
URL Rewrite モジュール 2.1 にはVC ランタイムのインストールが必要になります
このためserver2016では問題ありませんが、Windows10ではエラーになることがあります。
「VisualC++のランタイム」をインストールすれば、問題は解決します。
それが面倒な場合は、上記の「URL Rewrite Module 2.0」のインストールを実行するのも一つの方法です。

URL Rewrite Module を使う

・それまでのURLの書き換え
Server2003 IIS6.0までは、URLを書き換えるため、ThunderMain URLRewriterというツールを使用していました。

・ワイルドカードのマッピング
このツールの設定方法は、まず、書き換えるディレクトリをアプリに変換し、binフォルダを作成し、そこにDLLファイルをいれる。
アプリの構成で、ワイルドカードのマッピングを追加して、ハンドラに.netのDLLを指定してやる。
ディレクトリ下にglobal.asaxを用意して、イベントハンドラを設定し、ThunderMain.URLRewriter関数を指定する。
さらにweb.configを用意して、その中に、変換のルールを正規表現で記述しておく。
以上でそのディレクトリに来たリクエストは、ルールに従って、指定したアプリにクエリ付きで変換されます。
各ディレクトリ毎に設定を行うのは、ツールでは、ディレクトリ(/)だけのURLを捕まえることができないからです。/のリクエストは、まずIISがこれを捕まえて、既定のドキュメント(例えばindex.aspx)に処理を渡してしまいます。つまり.netまで回ってこないのです。変な書き方をすると、思わないエラーが起きることになります。

IIS6.0のワイルドカードマッピング

・server2012で動作しない
今回サーバーを新しくすることになり、Server2012R2を導入しました。そして、IISでサイトを作成し、上記の方法で、DLLおよびweb.config等を設定しました。ところが、このIISにはアプリの構成やワイルドカードのマッピングがありません。よくよく見ると、ハンドラ マッピングというそれらしいアイコンがあったので、それをクリックしてみました。
そこにワイルドカード スクリプト マッピングというのがあったので、これで設定することにしました。画像で分かるように、ワイルドカード*がたくさんあります。一抹の不安を感じながら、URLを実行すると、案の定URLがないというエラーが出ました。その後*を捕まえるため、色々と試してみましたが、見事に全滅しました。ネットもかなり調べましたが、原因は分かりません。これがIISのバージョンアップなのだろうということで、あきらめることにしました。

IIS8.5のワイルドカードマッピング、うまく動作しない。

・Microsoft URL Rewrite Module 2.0
その後、「IIS URL Rewrite」で検索していると、なんだかIISでもURLの書き換えができるというような記事がいくつか見つかりました。さらに調べていくと、Microsoft URL Rewrite Moduleというツールに行き着きました。IIS7.0(Server2008)から提供されていたようです。サイトを構築する上で必要なことなので、今までも、何回か「IIS URL Rewrite」に関して情報がないかどうかは調べていましたが、気がつきませんでした。

・あまり使われていない
これだけ徹底的に調べて、ようやく見つかったということは、この機能はあまり使用されていないということなのでしょう。IIS(.net、Windows)ユーザーは、多分URLを書き換えることがほとんどないのでしょう。確かに実務本位の業務用システムにはURLの整形は全く必要ありません。
しかし、業務用アプリではなく、商用サイトとしてWEBを構築する場合、?から始まるクエリでページを表すのはあまり賢明ではありませんし、ともするとApacheユーザーからはバカにされます。page.aspx?p=1ではなく、1.htmlあるいは1.aspxとした方が分かりやすく、スマートになります。
たったこれだけのことですが、今までのIISでは簡単にはできませんでした。WordPressやPHPなどApache系のwebでは常識なのですが…。これでようやく、ApacheにIISが追いついたというか、webの仲間入りできたことになります。

・モジュールのインストール
URLを書き換えモジュールをダウンロードしてインストールします。IISマネージャに「URL 書き換え」のアイコンが表示されます。

「URL 書き換え」のアイコン

・Web.config
トップページのweb.cofigファイルの<system.webServer>ブロックに書き換えルールを書きます。
下記は、/aaa/10.aspxを/aaa/page.aspx?p=10に書き換える例です。

<system.webServer>
  …
  <rewrite>
    <rules>
      <rule name="1">
        <match url="^aaa/(.*).aspx$" />
        <action url="/aaa/page.aspx?p={R:1}" type="Rewrite" />
      </rule>
      <rule name="3">
        <match url="^abc/(.*)/(.*).html$" />
        <action url="/a/b/c.aspx?d={R:1}&amp;n={R:2}" 
          type="Rewrite" />
      </rule>
    </rules>
  </rewrite>
</system.webServer>

ルールは正規表現で書きます。
先頭の^と末尾の$を入れておくことが必要です。これがないと、/bbbaaa/や1.aspx/もマッチしてしまいます。
()でくくると変数扱いになります。変数呼び出しは正規表現では$1、$2ですが、ここでは{R:1}、{R:2}…になります。変数というより、変数の配列と考えた方がいいでしょう。ちなみに{R:0}はURL全体になるようです。試してみてください。
&は&amp;と書きます。web.configファイルはXMLファイルのため、<や&はそのまま書くとエラーになります。
ルールを書いたweb.cofigを保存します。間違いがなければ、即「URL書き換え」が実行されます。

・GUI
URL書き換えルールは、IISのGUI(URL書き換え)でもできます。MSのテクニカルサイトにはこちらの記述方法が載っています。
上記のようにWeb.configを編集すると、それがGUIでも表示されます。書き方がまずいとXMLエラーになり、内容が表示されない場合がありますので注意が必要です。正式な記述を知りたい場合は、GUIを使用した方がいいでしょう。
結果はWeb.configに反映されます。


GUIでルールを記述、編集する

「URL 書き換え」はApache並みの複雑なURL書き換え、リダイレクト、ヘッダー等の分析もできるようになっているようです。詳しくはMSのテクニカルサイトを参照してください。

Comments are closed.