WebMatrix のルーティング

執筆日時:

保護されたファイル・フォルダ

一部の特殊な意味を持つファイルやフォルダには、Webブラウザーからアクセスできない。逆に言えば、外部からアクセスされては困るファイルやフォルダは、特定のフォルダに格納したり、ファイル名を規約に従ってつければいい。

bin にはアクセスできない

f:id:daruyanagi:20120706163939p:plain

bin にはコンパイルされたアセンブリが格納されているので、当然アクセスが禁止されている。

App_Data / App_Code にはアクセスできない

f:id:daruyanagi:20120706164032p:plain

  • App_Data:アプリケーションのデータを格納(データベースなど)
  • App_Code:アプリケーションのソースコードを格納(ヘルパーなど)

外からみえたら困るので、やっぱりアクセスが禁止されている。

名前が「_」から始まるファイルにはアクセスできない

f:id:daruyanagi:20120706164127p:plain

  • _AppStart.cshcml:アプリケーションが起動するとき一度だけ実行される(グローバル変数の初期化、Web サービスの API キー格納など)
  • _PageStart.cshtml:配置されたフォルダ以下にあるページが表示されるごとに実行される(レイアウトの指定やキャッシュコントロール、アクセス制御など)

正直なところ _PageStart.cshtml でアクセス制御ができるのは知らなかったかも。今度使っちゃおう。

@{
Response.CacheControl = "no-cache";

if (!WebSecurity.IsAuthenticated) { Response.Redirect("~/Account/Login"); } }

そのほか、レイアウトファイル(たとえば“_Layout.cshtml”)や部分ビュー(たとえば“_Partial.cshtml”)も、外部に公開する必要はないので名前の先頭に「_」をつけることが多い。また、一時的に Web ページを非公開にする場合にも、リネームだけで対応できるので便利。ちなみに、コードからはちゃんとアクセスできるのでご安心を。

名前の解決

いくつかのルールはあるが、あまり難しくはない。工夫次第では URL をクール&クリーンに保つことができる。

静的な解決

まずは、存在するファイル・フォルダへのアクセスの規則を確認する。

拡張子ありのファイルアクセス

f:id:daruyanagi:20120706170046p:plain

あまり使わないが CSHTML (Razor C#) ファイルも“index.html”のように拡張子まで指定してアクセスできる。

拡張子なしのファイルアクセス

f:id:daruyanagi:20120706170439p:plain

CSHTML (Razor C#) ファイルは拡張子を省くことも可能*1。こっちのほうがモダンかつクールかもしれない。

ディレクトリへのアクセス

f:id:daruyanagi:20120706170656p:plain

“index.html”などが表示される。優先順位は[サイト]-[設定]で変更できる。

動的な解決 ―― UrlData[]

f:id:daruyanagi:20120706171307p:plain

/あ.cshtml/い/う/え/お
→ UrlData[] { "い", "う", "え", "お" }

の「あ.cshtml」以降のパラメータを、 UrlDate[] 配列で受け取ることができる。

f:id:daruyanagi:20120706171708p:plain

さらに、「お.cshtml」をリネームして「/あ/い/う/え/お.cshtml」による名前解決を無効にすれば、「あ.cshtml」の拡張子を省略することも可能。つまり、

/あ/い/う/え/お
→ UrlData[] { "い", "う", "え", "お" }

が得られる。これを利用すれば、 WebMatrix でも URL を動的に扱える。ちなみに、クエリ文字列( /?foo=bar&hoge=hauhau など)は Request.QueryString で受け取ることができる。

*1:HTML ファイルなどは、拡張子を省くことができないようだ