連載
» 2004年07月09日 05時00分 公開

.NET TIPS:[ASP.NET]クライアントからリクエストされたURLを取得するには?

[山田祥寛,著]
.NET TIPS
Insider.NET


「.NET TIPS」のインデックス

連載目次

 HttpRequestクラス(System.Web名前空間)は、クライアントから要求されたURL(リクエストURL)を取得するための、さまざまなプロパティを提供している(下表を参照)。リクエストURLはアクセス・ログを記録するようなケース、あるいは、ページへのアクセス制御を監視するようなケースなど、意外と多くの用途で利用できる情報だ。

プロパティ 概要
ApplicationPath 要求ページが属するアプリケーションの仮想パス
CurrentExecutionFilePath 要求ページの仮想パスを取得(追加パス情報を含まない)
FilePath 要求ページの仮想パスを取得(追加パス情報を含まない)
Path 要求ページの仮想パスを取得(追加パス情報を含む)
PathInfo 追加パス情報を取得
PhysicalApplicationPath 要求ページが属するアプリケーションの物理パス
PhysicalPath 要求ページの物理パス(追加パス情報を含まない)
RawUrl 要求ページの生のURL
Url 要求ページのURL(Uriオブジェクト)
リクエストURLを取得するための主要なプロパティ
「追加パス情報」については後述する。

 「TIPS:[ASP.NET]アプリケーション共通のロギングを行うには?(HTTPモジュール編)」「TIPS:[ASP.NET]ページ単位にユーザーのアクセス可否を制御するには?」などでもリクエストURL情報を利用しているので、具体的な用途については、こちらも併せて参照してみてほしい。

 次のサンプル・コードでは、上に挙げた各プロパティを利用して、リクエストURLを取得している。

<%@ Page ContentType="text/html" Language="C#" %>
<script runat="Server">
Hashtable objTbl = null;
void Page_Load(Object sender, EventArgs e){
  // Hashtableクラスに各プロパティ名と値をセットし、
  // DataGridコントロールにバインド
  objTbl = new Hashtable();
  objTbl.Add("ApplicationPath", Request.ApplicationPath);
  objTbl.Add("CurrentExecutionFilePath", Request.CurrentExecutionFilePath);
  objTbl.Add("FilePath", Request.FilePath);
  objTbl.Add("Path", Request.Path);
  objTbl.Add("PathInfo", Request.PathInfo);
  objTbl.Add("PhysicalApplicationPath", Request.PhysicalApplicationPath);
  objTbl.Add("PhysicalPath", Request.PhysicalPath);
  objTbl.Add("RawUrl", Request.RawUrl);
  objTbl.Add("Url", Request.Url);
  DataBind();
}
</script>
<html>
<head>
<title>リクエストURL</title>
<body>
<h1>リクエストURL</h1>
<hr />
<form runat="Server">
  <asp:DataGrid id="objGrd" runat="Server" ShowHeader="False"
    DataSource="<%# objTbl %>" AutoGenerateColumns="False" CellPadding="2">
    <ItemStyle   BackColor="#FFEEEE" />
    <AlternatingItemStyle BackColor="#FFDDDD" />
    <Columns>
      <asp:BoundColumn DataField="Key" />
      <asp:BoundColumn DataField="Value" />
    </Columns>
  </asp:DataGrid>
</form>
</body>
</html

リクエストURLを取得するC#のサンプル・プログラム(requestUrl_cs.aspx)

<%@ Page ContentType="text/html" Language="VB" %>
<script runat="Server">
Dim objTbl As Hashtable
Sub Page_Load(sender As Object, e As EventArgs)
  ' Hashtableクラスに各プロパティ名と値をセットし、
  ' DataGridコントロールにバインド
  objTbl=New Hashtable()
  objTbl.Add("ApplicationPath",Request.ApplicationPath)
  objTbl.Add("CurrentExecutionFilePath",Request.CurrentExecutionFilePath)
  objTbl.Add("FilePath",Request.FilePath)
  objTbl.Add("Path",Request.Path)
  objTbl.Add("PathInfo",Request.PathInfo)
  objTbl.Add("PhysicalApplicationPath",Request.PhysicalApplicationPath)
  objTbl.Add("PhysicalPath",Request.PhysicalPath)
  objTbl.Add("RawUrl",Request.RawUrl)
  objTbl.Add("Url",Request.Url)
  DataBind()
End Sub
</script>
<html>
<head>
<title>リクエストURL</title>
<body>
<h1>リクエストURL</h1>
<hr />
<form runat="Server">
  <asp:DataGrid id="objGrd" runat="Server" ShowHeader="False"
    DataSource="<%# objTbl %>" AutoGenerateColumns="False" CellPadding="2">
    <ItemStyle   BackColor="#FFEEEE" />
    <AlternatingItemStyle BackColor="#FFDDDD" />
    <Columns>
      <asp:BoundColumn DataField="Key" />
      <asp:BoundColumn DataField="Value" />
    </Columns>
  </asp:DataGrid>
</form>
</body>
</html>

リクエストURLを取得するVB.NETのサンプル・プログラム(requestUrl_vb.aspx)

 上記のサンプル・コードを実行したのが、次の画面である。

サンプル・プログラムの実行結果 サンプル・プログラムの実行結果
http://localhost/netIns/requestUrl_vb.aspx/sample?key=123というURLでアクセスした場合のサンプル・プログラムの実行結果。

 各プロパティを区別するポイントとして、以下の4点が挙げられる。

  • パスの種類(アプリケーションパス/ファイルパス/追加パス)
  • 物理パスか、仮想パスか
  • クエリ情報(?キー名=値)を含むか
  • 追加パス情報を含むか

 追加パス情報とは、リソースの位置を表すパスそのものとは少々種類の異なる――むしろ「付随的な入力パラメータ」ともいうべき情報だ。本稿の例の場合は「/sample」の部分のことをいう。プログラム・コードから利用できるパラメータという意味ではクエリ情報にも似ているが、クエリ情報が「?キー名=値」のような、実際のパスとは異なるフォーマットで記述しなければならないのに対し、追加パス情報は、その名のとおり、あたかもパスの一部であるかのように、パラメータ情報を記述できるという違いがある。

 以上の観点で、いま一度、おのおののプロパティを分類してみよう。

プロパティ 種類 物理/仮想 クエリ情報 追加パス
ApplicationPath アプリケーションパス 仮想 × ×
PhysicalApplicationPath アプリケーションパス 物理 ×
CurrentExecutionFilePath ファイルパス 仮想 × ×
FilePath ファイルパス 仮想 × ×
Path ファイルパス 仮想 ×
PhysicalPath ファイルパス 物理
RawUrl ファイルパス 仮想
Url ファイルパス 仮想(フルURL)
PathInfo 追加パス 仮想 ×
リクエストURLを取得するための主要なプロパティの分類比較表
表中の○は、列項目の情報(クエリ情報もしくは追加パス情報)を「含む」ことを意味し、×は「含まない」ことを意味する。

 サンプル・コードの実行結果と併せてみると、それぞれのプロパティの役割の違いがだんだん見えてくるのではないだろうか。ただ、比較表からだけでは分からないのが、CurrentExecutionFilePathプロパティとFilePathプロパティの違いだ。この2つのプロパティの違いが出てくるのは、Server.Executeメソッド、Transferメソッドを利用した場合だ。これらのメソッドを利用した場合にも、FilePathプロパティは常に「最初に要求された」URLを返すが、CurrentExecutionFilePathプロパティは「転送/インクルード先ページ」のURLを返す。

カテゴリ:Webフォーム 処理対象:URL
使用ライブラリ:HttpRequestクラス(System.Web名前空間)
関連TIPS:[ASP.NET]アプリケーション共通のロギングを行うには?(HTTPモジュール編)
関連TIPS:[ASP.NET]ページ単位にユーザーのアクセス可否を制御するには?


「.NET TIPS」のインデックス

.NET TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。