WebSurfer's Home

トップ > Blog 1   |   ログイン
APMLフィルター

二重スラッシュを含む URL 書換

by WebSurfer 2015年1月23日 14:10

IIS の URL Rewrite モジュールを使用して aaaa/1/2/3 という URL を test.aspx?x=1&y=2&z=3 というように書き換えることを考えます。

URL の書き換え

この時、たとえば上の画像のように 2 つ目の値をスキップした aaaa/1//3 という URL を test.aspx?x=1&y=&z=3(y に値がないところに注目)に書き換えたい場合はどうすればいいでしょうか?

IIS7 の URL Rewrite モジュールを使って、普通に(というか、あまり深く考えずに)書換ルールを作ると以下のようにすると思います。

<rewrite>
  <rules>
    <rule name="DoubleSlash">
      <match url="aaaa/(.*)/(.*)/(.*)" />
      <action 
        type="Rewrite" 
        url="test.aspx?x={R:1}&y={R:2}&z={R:3}" />
    </rule>
  </rules>
</rewrite> 

IIS マネージャーの「テストパターン」ダイアログ上で、[テスト対象データの入力(D):]テキストボックスに aaaa/1/2/3 とか aaaa/1//3 などのテストパターンを入力してテストすると、 {R:1}, {R:2}, {R:3} には期待通りの結果が得られます。

なので、ブラウザから aaaa/1/2/3 とか aaaa/1//3 などで呼んでも同様に aaaa/(.*)/(.*)/(.*) にマッチして、test.aspx?x=1&y=2&z=3 とか test.aspx?x=1&y=&z=3 に書き換えられると期待すると思います。

しかし、ブラウザから aaaa/1//3 で呼ぶとダメです。ダメな理由は、IIS が aaaa/1//3 を aaaa/1/3 に書き換えてしまうからです。詳しく書くと以下の通りです。

  1. ブラウザからは aaaa/1//3 で要求が出る。
  2. それを受けた IIS は aaaa/1//3 を aaaa/1/3 に書き換えてしまう。
  3. aaaa/1/3 が URL Rewrite モジュールに渡される。
  4. aaaa/1/3 は aaaa/(.*)/(.*)/(.*) にはマッチしない。マッチしないので書き換えは行われない。
  5. 書き換えが行われないので、IIS は aaaa/1/3 で指定されるリソースを探す。
  6. そのようなリソースは存在しないので HTTP エラー 404.0 - Not Found となる。

ちなみに、aaaa/1/2/3 であれば期待通り test.aspx?x=1&y=2&z=3 に書き換えられ、test.aspx ページ内でクエリ文字列は正しく取得できます。

上記 2 がどうして分かったかと言うと、6 で表示されるエラー画面で「要求された URL http://aspnet4site:80/aaaa/1/3」となっていたからです。(aspnet4site は自分の開発マシンで使っているホスト名です)

というわけで、上記 2 を何とかしないと URL Rewrite モジュールでは対処できないということになります。

それを何とかする手段が IIS Server Variables の UNENCODED_URL を使用して IIS が処理する前の URL を取得して、それに書換ルールを適用することです。

詳しい手順は Microsoft IIS.net の記事 URL Rewrite Module Configuration Reference の中の「Using server variables in rewrite rules」および「Using back-references in rewrite rules」というセクションが参考になると思います。

具体的な書換ルールのコードは、今回のケースでは以下のようになります。

<rewrite>
  <rules>
    <rule name="DoubleSlash">
      <match url="^aaaa/" />
      <action 
        type="Rewrite"
        url="test.aspx?x={C:1}&y={C:2}&z={C:3}" />
      <conditions>
        <add 
          input="{UNENCODED_URL}" 
          pattern="^/aaaa/(.*)/(.*)/(.*)" />
      </conditions>
    </rule>
  </rules>
</rewrite>

上記のルールで、aaaa/1/2/3 でも、aaaa/1//3 でも、aaaa//2/3 でも、 aaaa/// でも、その他全てのパターンで期待通り書き換えられるのを確認できました。

Tags: ,

Windows Server

CA 証明書の有効期限

by WebSurfer 2015年1月17日 18:51

先の記事 Active Directory 証明書サービス (AD CS) で紹介しました CA 証明書ですが、それには有効期限があって、手動で書き換える必要があります。

CA 証明書の書き換え

CA 証明書は AD CS の初回インストール時には自動的に発行されインストールされますが、有効期限はデフォルトで 5 年(AD CS のインストール時に変更できます)なので忘れたころに期限切れになります。

期限切れになっても自動的には更新されないので注意が必要なようです。(実は、自分は気がつかなかったです。(汗))

ブラウザで Web を通して http://localhost/certsrv から CA 証明書をダウンロードしても、古いものがダウンロードされるだけです。(実は、それで更新されるのではないかと思ってやってみたのですが、ダメでした。まぁ、考えてみれば当たり前ですね。(笑))

更新(書き換え)するには以下の操作が必要です。

  1. [管理ツール] から [証明機関] を開く。
  2. 証明機関管理コンソールの左のコンソール ツリーより CA 名(上の画像の例では bglb-SVR2K8-CA)を右クリックし、 [すべてのタスク] ⇒ [CA 証明書の書き換え] を選択。
  3. 証明書サービスを停止するか聞かれるので [はい] をクリック。
  4. 証明するキー (秘密鍵) を書き換えるか聞かれるので、 [いいえ] を選択し、 [OK] をクリック。

なお、有効期限を変更することは可能だそうです。具体的には Microsoft TechNet ブログの記事 CA 証明書の有効期限 を参照してください。

Tags:

Windows Server

Mvc.dll のバージョン相違

by WebSurfer 2015年1月12日 16:06

Windows Update によって、知らないうちに System.Web.Mvc.dll のバージョンが変わり、突然 Visual Studio で MVC アプリケーションのビルドが通らなくなったという話を書きます。ちょっと古い話ですが、またあるかもしれませんので、備忘録として。

System.Web.Mvc.dll

2014 年の 5 月中旬の Windows Update に含まれる Microsoft ASP.NET MVC セキュリティ更新プログラム MS14-059 (KB2990942) によって、参照先(C:\Program Files\Microsoft ASP.NET\ASP.NET MVC 3\Assemblies\System.Web.Mvc.dll)の System.Web.Mvc.dll のバージョンが 3.0.0.0 から 3.0.0.1 に変わってしまいました。上の画像を参照ください。

Visual Studio 2010 の MVC3 インターネットアプリケーションのテンプレートを使って Web アプリを作ると、「ローカルコピー」が False になっているので(上の画像を参照・・・True にすると bin フォルダにコピーされる)、アプリは上に書いた参照先の .dll を参照しますが、プロジェクトファイル (.csproj) では 3.0.0.0 の指定のままなので、バージョン不一致でビルドが通らないと言うことのようです。

解決策は stckoverflow の記事 ASP.NET MVC security patch to version 3.0.0.1 breaks build [duplicate] にありますように、以下の手段を取るのがよさそうです。

  1. Visual Studio の「ソリューションエクスプラーラー」で、System.Web.Mvc の参照設定を一旦削除してからやり直す。

    蛇足ですが、手動でプロジェクトファイルを編集する方法もあるそうです。興味がありましたら、msdn ブログの記事 Visual Studio で現在開いてるプロジェクトファイル (.csproj, .vbproj) を編集する方法 を見てください。
  2. 「ローカルコピー」プロパティを False から True に変更する。(上の画像を参照。今後の Windows Update による影響を受けないようにするため)
  3. web.congfig の bindingRedirect 要素を以下のように修正する。
<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity 
          name="System.Web.Mvc" 
          publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect 
          oldVersion="1.0.0.0-3.0.0.0" 
          newVersion="3.0.0.1" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

なお、MVC4 でも System.Web.Mvc.dll のバージョンは 4.0.0.0 から 4.0.0.1 に変わっています(未確認ですが、MVC2, MVC5 も同様だと思います)。ただし、MVC4 の場合、参照設定と参照先の .dll のバージョン不一致の問題は出なかったので気がつきませんでした。

参考までに、なぜ MVC4 では問題が出なかったかを以下に書いておきます。

Visual Studio 2010 のインターネットアプリケーションテンプレートで MVC4 アプリを作ると、アプリケーションルート直下の packages フォルダに System.Web.Mvc.dll ほか必要な .dll がコピーされます。(NuGet によるパッケージ管理のため?)

コピーされる .dll のバージョンは 4.0.0.0 で、当然ですが参照設定もそのバージョンになります。

Visual Studio で System.Web.Mvc のプロパティを見るとわかりますが、「ローカルコピー」が True に設定されているので、ビルドする時に bin フォルダに .dll がコピーされます。

Windows Update によって packages フォルダの .dll は書き換えられることはないので、参照設定と参照先(bin フォルダの .dll)のバージョンの不一致は起こらないという仕組みです。

なお、Windows Update 後に新たに MVC4 プロジェクトを作っても、使われる System.Web.Mvc.dll は 4.0.0.0 のままとなります(自動的に最新バージョンが参照されることはない)ので注意してください。

具体的に言うと、C:\Program Files\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies の方の System.Web.Mvc.dll は 4.0.0.1 に更新されますが、C:\Program Files\Microsoft ASP.NET\ASP.NET MVC 4\Packages の方は 4.0.0.0 のままになり、プロジェクトの packages フォルダにコピーされるのは後者のフォルダにある 4.0.0.0 となるようです。

4.0.0.0 から 4.0.0.1 への更新が必要であれば、Visual Studio のテンプレートで Web アプリを作成後、NuGet のパッケージマネージャーを使って手動で行う(「NuGet パッケージの管理」を起動して、その中から「Microsoft ASP.NET MVC 4」を選択して更新をかける)必要があります。

Tags:

MVC

About this blog

2010年5月にこのブログを立ち上げました。主に ASP.NET Web アプリ関係の記事です。

Calendar

<<  2024年4月  >>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

View posts in large calendar