読者です 読者をやめる 読者になる 読者になる

miso_soup3 Blog

主に ASP.NET 関連について書いています。

URL Rewrite と Tilde(~) の併用時の注意

ASP.NET ASP.NET MVC

2年前の古いネタになりますが、Razor 3(ASP.NET MVC 4)の破壊的変更により、
URL Rewrite と <a href="~/Content/pa.jpg"/> 等といったチルダを併用すると、想定したパスが出力されない可能性があります。

URL Rewrite にて、Request URL と 書き換え後の URL の階層が同じ場合は、問題は起きません。

参考

目次

対策

Global.asax にて

public void Application_BeginRequest(object sender, EventArgs e) 
{ 
     Context.Items["IIS_WasUrlRewritten"] = "false"; 
}

または、

.cshtml の中で(_Layout.cshtml とか)

Request.ServerVariables.Remove("IIS_WasUrlRewritten");

再現手順

準備

ASP.NET のプロジェクトを用意し、下記の用に「/Content/pa.jpg」で取得できる画像を用意します。

[root]
└Content フォルダ
└pa.jpg

「/Home/About」でアクセスできるページを用意し、そのページにて

<img src="~/Content/pa.jpg" />

と HTML タグを挿入します。

「/Home/About」でアクセスし、画像が正しく表示されていることを確認します。

f:id:miso_soup3:20150928184714p:plain
かぼちゃの画像。

パターン A /profile -> /home/about

Web.config にて、「/profile」 でアクセスしたときに、「/home/about」 へ URL を書き換えるように設定します。

<rewrite>
  <rules>
    <rule name="slug" stopProcessing="true">
      <match url="^profile" ignoreCase="true"/>
      <action type="Rewrite" url="/home/about"/>
    </rule>
  </rules>
</rewrite>

実行し、「/profile」でアクセスすると、エラーとなります。

f:id:miso_soup3:20150928185001p:plain

”追加情報:最上位ディレクトリの先頭に .. を使用することはできません。”

パターン B /home/profile/dayo -> /home/about

Web.config にて、「/home/profile/dayo」 でアクセスしたときに、「/home/about」 へ URL を書き換えるように設定します。

<rewrite>
  <rules>
    <rule name="slug" stopProcessing="true">
      <match url="^home/profile/dayo" ignoreCase="true"/>
      <action type="Rewrite" url="/home/about"/>
    </rule>
  </rules>
</rewrite>

実行し、「/home/profile/dayo」でアクセスすると、画像が表示されません。

ソースを表示すると、次のように想定していないパスが出力されています。

f:id:miso_soup3:20150928185249p:plain

パターン C /home/profile -> /home/about

パターンA, B と同じように、Web.config にて、「/home/profile」 でアクセスしたときに、「/home/about」 へ URL を書き換えるように設定します。

この場合は正しく画像が表示されます。