Share via


ASP.NET Web Forms の URL 書き換え

Ruslan Yakushev

ASP.NET アプリケーションで IIS URL Rewrite Module を使用する場合は、書き換えられた URL で Web アプリケーションが正しく動作することを確認することが重要です。 この記事では、URL 書き換えが ASP.NET Web アプリケーションに影響を与える可能性があるシナリオと、潜在的な問題の解決策について説明します。

目次

Form 要素のポストバック URL の設定

ASP.NET Web Forms ではポストバックが広範囲に使用されるため、ASP.NET ページの URL 書き換えを実行するのはやや難しくなります。 ページに 1 つ以上の Web サーバー コントロールが含まれている場合、ASP.NET では、そのページをレンダリングするときに、HTML フォーム要素の action 属性が、そのフォーム要素が存在するページ (つまりそのページ自体) を指すように設定されます。 そのページに URL 書き換えが使用されている場合、action 属性はブラウザーから要求された URL ではなく、書き換えられた URL を指します。 これにより、ポストバックが発生するたびに、ブラウザーのアドレス ボックスに書き換えられた URL が表示されます。

action 属性が間違った URL を指さないようにするため、そのページ上の HtmlForm インスタンスの Action プロパティを、ブラウザーによって要求されたポストバック URL に設定できます。 その URL を取得するには、HttpRequest.RawUrl プロパティを使用します。 次の例は、ASP.NET ページを変更してアクション URL を設定する方法を示しています。

protected void Page_Load(object sender, EventArgs e) 
{ 
    form1.Action = Request.RawUrl; 
}

Note

HtmlForm.Action プロパティは、.NET Framework バージョン 3.5 SP1 以降で使用できます。

ASP.NET マスター ページを使用している場合は、マスター ページの Page_Load メソッドにコードを追加して、そのマスター ページを使用するすべてのページのポストバック アクション URL を設定できます。

AJAX UpdatePanel コントロールの URL の書き換え

URL Rewrite Module を使用して、1 つ以上の UpdatePanel コントロールを含むページの URL を書き換えると、その UpdatePanel コントロールによって実行されるすべてのアクションに対して書き換えられた URL がコントロールで使用されます。 これにより、特に URL 書き換えによって要求された URL のディレクトリ階層が変更された場合に、UpdatePanel コントロールのコントロールが正しく動作しなくなる可能性があります。 たとえば、URL Rewrite Module を使用して /Products/Hardware を /Products.aspx に書き換えると、UpdatePanel コントロールでは UpdatePanel コントロール内のすべてのアクションに対して URL /Products/Hardware/Products.aspx が使用されます。 これにより、スクリプト エラーが発生します。

これを回避するには、前のセクションの「Form 要素のポストバック URL の設定」で説明したように、ページの HtmlForm インスタンスの Action プロパティを設定します。

Web サーバー コントロールでの "~" 演算子の使用

ASP.NET Web サーバー コントロールでパスを設定する必要がある場合は、~ 演算子を使用すると、アプリケーション ディレクトリのルートを参照できます。 ただし、URL の書き換えによって要求された URL のディレクトリ階層が変更されると、~ 演算子で指定されたリンクが正しく解決されない可能性があります。 たとえば、app1 という名前の Web アプリケーションのルートにあるDefault.aspx ページに次の Image コントロールが含まれているとします。

<asp:Image runat="server" ImageUrl="~/Images/MyImage.gif" />

URL の書き換えによって URL が http://localhost/app1/folder/file から http://localhost/app1/default.aspx に変更される場合、~ 演算子で指定されたリンクは、書き換えられた URL パスに対して相対的 (つまり、/app1 フォルダーからの相対パス) に解決されます。 次の例は、img 要素の結果として得られる HTML マークアップを示しています。

<img src="Images/MyImage.gif" ... >

ブラウザーは http://localhost/app1/folder/file を要求したため、http://localhost/app1/folder/Images/MyImage.gif からイメージを取得しようとします。 これにより、404 (ファイルが見つかりません) エラーが発生します。

URL Rewrite Module for IIS には、この動作を修正する ASP.NET の更新プログラムが含まれています。 この更新プログラムにより、Web サーバー コントロールで ~ 演算子が、最初に要求された URL を基準にして解決されるようになります。 前の例では、次のマークアップに示すように、応答内の HTML マークアップには img 要素の正しい URL パスが含まれます。

<img src="../Images/MyImage.gif" ... >

ASP.NET の更新プログラムは、.NET Framework 3.5 SP1 以降にのみ適用されます。 更新プログラムを取得するには、.NET Framework をバージョン 3.5 SP1 にアップグレードしてから、IIS URL Rewrite Module インストーラーを実行します。これにより、ASP.NET 更新プログラムがインストールされます。

URL とサイト ナビゲーション コントロールの書き換え

ASP.NET サイトマップを使用して Web サイトの構造を記述し、サイト ナビゲーション API とサイト ナビゲーション コントロールが (物理ではなく) 論理サイト構造を公開できるようにします。 サイト ナビゲーションを使用する ASP.NET アプリケーションで URL Rewrite Module を使用する場合は、通常、パブリックまたは仮想の URL を使用する論理サイト構造の観点からナビゲーション コントロールを動作させる必要があります。

たとえば、次の例に示すようにサイトマップを定義できます。

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0">
  <siteMapNode url="~/Products/" title="Products" description="Products Home Page">   
    <siteMapNode url="~/Products/Hardware/" title="Hardware" description="Hardware Products" /> 
    <siteMapNode url="~/Products/Software/" title="Software" description="Software Products" />
  </siteMapNode>
</siteMap>

その後、次の書き換えを実行する書き換えルールを定義できます。

  • /Products/ から /Products.aspx
  • /Products/Hardware から /Products.aspx?category=Hardware
  • /Products/Software から /Products.aspx?category=Software

これらの仮想 URL を使用してサイトマップを定義すると、SystemWeb.SiteMap クラスが正しく機能しなくなる可能性があります。 ASP.NET ページで SiteMap.CurrentNode プロパティにアクセスしようとすると、プロパティに null が含まれている場合があります。 これにより、SiteMapPath や Menu などのサイト ナビゲーション コントロールが正しく動作しなくなる可能性があります。

URL Rewrite Module for IIS には、書き換えられた仮想 URL を操作できるようにナビゲーション コントロールを修正する ASP.NET の更新プログラムが含まれています。 この更新プログラムを使用すると、SiteMap.CurrentNode プロパティで現在要求されている仮想 URL に対応する SiteMapNode が参照されるようになります。

ASP.NET の更新プログラムは、.NET Framework 3.5 SP1 以降にのみ適用されます。 更新プログラムを取得するには、.NET Framework をバージョン 3.5 SP1 にアップグレードしてから、IIS URL Rewrite Module インストーラーを実行します。これにより、ASP.NET 更新プログラムがインストールされます。

ASP.NET Web リソースの要求の書き換えを防止する

ASP.NET ベースの Web アプリケーションは、アセンブリ リソースを取得して Web ブラウザーに提供するために WebResources.axd ファイルに対して要求を行うことがよくあります。 WebResources.axd が要求されると、ASP.NET によってコンテンツが動的に生成されるため、サーバー上にはそのようなファイルは存在しません。 したがって、要求された URL が Web サーバーのファイル システム上のファイルまたはフォルダーに対応していない場合にのみ、書き換えまたはリダイレクトを行う URL 書き換えルールがある場合、そのルールによって WebResources.axd に対して行われた要求が誤って書き換えられ、アプリケーションが中断される可能性があります。

この問題は、書き換えルールに条件を 1 つ追加すると簡単に防ぐことができます。

<rule name="RewriteUserFriendlyURL1" stopProcessing="true">
  <match url="^([^/]+)/?$" />
  <conditions>
    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
    <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    <!--  The following condition prevents rule from rewriting requests to .axd files -->
    <add input="{URL}" negate="true" pattern="\.axd$" />
  </conditions>
  <action type="Rewrite" url="article.aspx?p={R:1}" />
</rule>