URLParamFilter Version 1.2 使用例

DOCUMENT

IIS で GET メソッドの引数ではなく URL 自体に値を持たせることを可能にするための ISAPI フィルタです。

URL の文字数制限も可能です。


使用例

基本編

VirtualPoint の書き方

たとえば /dir1/dir2/test.asp にマッチさせたい場合は、VirtualPoint に /dir1/dir2/ と書きます。

もちろん /dir1/ だけでも可能ですが、その場合には ModeOption に 0 を指定して、フィルタ処理に冗長性を持たせる必要があります。

 

VirtualPoint でワイルドカードを使う

たとえば /jp/index.asp や /en/index.asp といった URL を同一の index.asp などで処理したい場合には、ワイルドカードを使用して /*/ とします。

 

相対的に URL をずらす

たとえば /jp/index.asp のほかにも /jp/life/index.asp などがあり、また、/en/index.asp のほかに /en/life/index.asp などがあるとします。

それぞれを /f__proc/index.asp や /f__proc/life/index.asp など同じスクリプトで処理したい場合には、VirtualPoint に /*/** を指定して、RealPoint に /f__proc/ を指定します。

 

拡張子を限定する

VirtualPoint が /func/ だった場合、/func/index.asp も /func/index.html もマッチします。

index.asp しか受け付けないようにするには、AcceptType に asp を指定します。

 

ModeOption で冗長性を調整する

たとえば VirtualPoint に /sample/*/ と指定したとします。

このとき ModeOption に 1 が指定されていると冗長性がなくなり、たとえば /sample/xxxx/index.asp にマッチしますが、/sample/xxxx/xxxx/index.asp にはマッチしなくなります。

逆に ModeOption に 0 が指定されている場合は、/sample/xxxx/index.asp と /sample/xxxx/yyyy/index.asp のどちらにもマッチします。このとき、後者は、冗長部分の yyyy が URLPARAM-OPTIONS 環境変数に格納されます。逆に前者は URLPARAM-OPTIONS 環境変数は登録されません。

 

ファイル名を分割する

たとえば Separator に "-" が設定されている状態で、/corner/1-3-5.asp がマッチしたとします。

そのとき、URLPARAM-TARGET に格納されるファイル名は、それぞれ Separator の先頭文字で分割されて、"1,3,5" という文字列で格納されます。

 

 

実用・応用編

GET メソッドの引数として使用していた値を URL に含める

たとえば http://localhost/goods/CDs/detail.asp?item_id=1003 というように、商品 CD の詳細情報を表示する ASP ページがあったとします。

 

このときに URLParamFilter を次のように設定すると、http://localhost/goods/CDs/1003.asp という URL でアクセスすることができるようになります。

Identifier  
VirtualPoint /goods/*/
RealPoint /goods/f__detail.asp
SpecialValue  
Separator  
AcceptType asp
ModeOption 1

 

するとこのとき、環境変数から次の値を取得することができます。

URLPARAM-TYPE asp
URLPARAM-TARGET 1003
URLPARAM-MATCHES CDs

URLPARAM-TARGET の部分が、GET メソッドの引数だった item_id に対応します。

 

また、国名やジャンルを含めてたい場合にも、

Identifier CD-DETAIL
VirtualPoint /goods/CDs/*/*/
RealPoint /goods/f__detail.asp
SpecialValue  
Separator  
AcceptType asp
ModeOption 1

というようにしてやれば、たとえば http://localhost/CDs/JP/Pops/1003.asp と要求すると次のような環境変数が取得できます。

URLPARAM-TYPE asp
URLPARAM-TARGET 1003
URLPARAM-MATCHES JP,Pops

また、http://localhost/CDs/JP/Jazz/1000.asp とすれば、

URLPARAM-TYPE asp
URLPARAM-TARGET 1000
URLPARAM-MATCHES JP,Jazz

という情報を取得できます。これらはどれも実際は /goods/f__detail.asp が呼び出されますので、この中で環境変数に応じて適切な情報を検索して表示させれば、立派に GET メソッドの引数の代役を務めることができます。

 

ほかにも、http://localhost/CDs/JP/Pops/ という URL で Pops 系 CD の一覧を表示させたい場合には、

Identifier CD-LISTUP
VirtualPoint /goods/CDs/*/*/
RealPoint /goods/f__listup.asp
SpecialValue  
Separator  
AcceptType /
ModeOption 1

というようにして、ディレクトリで終わる URL は f__listup.asp にまわして、そこで URLPARAM-MATCHES の内容を元に、適切な一覧を表示するようにします。

ただし、フィルタデータは上から順に適用されるため、このような場合は、CD-DETAIL よりも CD-LISTUP の方を上位に登録する必要があります。

 

 

ひとつの ASP で対処する

たとえばアクセスカウンタの集計ページを作るとします。

カウンタが1時間ごとに記録されるようになっていたとして、それを 「1日ごと」 、「月ごと」 、「年間」 の3通りで集計したページを用意したとします。集計する情報は同じですから、GET メソッドの引数を使って切り換えるというのが一般的だと思います。

このとき、それぞれ

  • http://localhost/count.asp?mode=daily
  • http://localhost/count.asp?mode=monthly
  • http://localhost/count.asp?mode=yearly

 というような URL でもいいのですが、URLParamFilter を使って次のような URL にすることもできます。

  • http://localhost/count/daily.html
  • http://localhost/count/monthly.html
  • http://localhost/count/yearly.html

 

この場合、URLParamFilter は次のように設定します。

Identifier  
VirtualPoint /count/
RealPoint /count/f__view.asp
SpecialValue  
Separator  
AcceptType html
ModeOption 1

 

すると、たとえば http://localhost/count/monthly.html が要求されたときには、次のように環境変数が登録されます。

URLPARAM-TYPE html
URLPARAM-TARGET monthly

 

そして実際の処理は /count/f__view.asp にゆだねられます。

もし http://localhost/count/daily.html が要求されたときには URLPARAM-TARGET の値が "daily" に変わるわけですから、後はこの f__view.asp ページのなかで、URLPARAM-TARGET の値に応じて、適切な集計処理をするだけです。

 

 

相対パスを使って、基本情報を持ち歩く

たとえば、トップページで地域を選択して、あとはその地域に適した情報を表示するサイトを展開するとします。

そのとき通常は

  • http://localhsot/service/index.asp?area=yokohama
  • http://localhost/sports/tennis/index.asp?area=yokohama
  • http://localhost/sports/tennis/shop/index.asp?area=yokohama

などと、このように地域情報を引き継いでいかなくてはいけません。

そして、たとえば http://localhost/sports/tennis/shop/index.asp?area=yokohama という、テニス関連のお店情報から、ひとつ前のページのテニス関連情報ページへ移動する際も、http://localhost/sports/tennis/index.asp?area=yokohama というように改めて地域情報を引数にセットしなくてはいけません。

 

ASP の場合 Session 変数というのがありますのでそこに格納しておけば簡単なのですが、i-mode など、Cookie が利用できない携帯端末では Session を使えないので、上記のような方法をとらざるを得ません。

上記のように引数が1つだけならばさほど苦労はしませんが、これが4つや5つになるとなかなか大変です。

 

ここで URLParamFilter を使用してみます。

たとえば、上記のページをすべて、/f__page/ で始まる URL で作成したとします。すなわちそれぞれが次のような感じになります。

  • http://localhost/f__page/service/index.asp
  • http://localhost/f__page/sports/tennis/index.asp
  • http://localhost/f__page/sports/tennis/shop/index.asp

 

このときに次のような設定をします。

階層が同一よりも掘り下がるので、ModeOption = 0 として、フィルタ処理の冗長性を持たせています。

Identifier  
VirtualPoint /*/**
RealPoint /f__page/
SpecialValue  
Separator  
AcceptType *
ModeOption 0

 

するとこのような URL で地域情報も含めた URL を表現することができます。

  • http://localhost/yokohama/service/index.asp
  • http://localhost/yokohama/sports/tennis/index.asp
  • http://localhost/yokohama/sports/tennis/shop/index.asp

このときどれも、URLPARAM-MATCHES には "yokohama" という値が記録されますので、これを地域の値として利用します。もちろん、http://localhost/tokyo/service/index.asp とすれば、"yokohama" が "tokyo" になって、同一の ASP ページが呼び出されます。

 

これらの URL は /*/** という VirtualPoint によって、"yokohama" がマッチして URLPARAM-MATCHES に格納された後、それ以降の URL が RealPoint に付け加えられます。よって結局は、

  • http://localhost/f__page/service/index.asp
  • http://localhost/f__page/sports/tennis/index.asp
  • http://localhost/f__page/sports/tennis/shop/index.asp

がアクセスされます。あとはそれぞれのページで URLPARAM-MATCHES を読み込んで、適切な地域の情報を取り出すスクリプトを作成します。

 

この仕組みには利点がもうひとつあります。

たとえばテニス関連の情報を http://localhost/yokohama/sports/tennis/index.asp で見れるとします。そしてそのページにある 「用品店」 というリンクから相対パスで "shop/index.asp" にリンクが張られていたとします。すなわち、http://localhost/yokohama/sports/tennis/shop/index.asp です。

このとき、用品店からもとのテニス関連情報のページへ戻るにはどうしたらいいか。その場合は単純に相対パスで "../index.asp" へリンクを張ればいいことになります。

地域を特定する情報は最初のディレクトリで指定されていますので、 ../index.asp で戻ってもちゃんと、http://localhost/yokohama/sports/tennis/index.asp というように "yokohama" であることがわかります。

当然ながら、"tokyo" だったとしても、なんら例外なく上記の方法でリンクが張れます。

 

これなら Cookie がサポートされていないために Session 変数が使用できないという場合でも、工夫をすれば簡単に値を持ち運ぶことができるようになると思います。

携帯電話用のサイトなどで、Session 変数も使えず、1ページの容量が少ないために頻繁にページをまたがないといけないような場合に、とても威力を発揮するのではないかと思います。

 

 

バージョンごとのドキュメントの、最新バージョンページを常設する

たとえば各バージョンごとのドキュメントを用意しているとします。

その説明書が、/document/v1.1/index.html とか /document/v1.2/index.html とかいうパスで保存されているとき、/document/current/index.html で、最新のドキュメントが常に見れるようにします。

 

Identifier  
VirtualPoint /document/current/**
RealPoint /document/v1.2/
SpecialValue  
Separator  
AcceptType html
ModeOption 0

このように設定すると、/document/current/index.html という URL でカレント (現在の) バージョンのドキュメントを参照すると、URLParamFilter が自動的に /document/v1.2/index.html を取得してくれます。

バージョンが更新されて /document/v1.3/ が用意された場合には、RealPoint の値を修正するだけで、同一 URL での対応が可能です。もちろん、リダイレクト処理をやってしまえば URLParamFilter の力など必要ないですけどね。