本文へジャンプ

ソフトウェア > Lotus > Lotus Developer Domain > 

Iris Today Archives

ドミノ Rnext で Web アプリケーションを作る:Web サイト・ルール


Lotus Software
by John Chamberlain
レベル:ビギナー
対象:Domino Rnext
原文の掲載:2001年10月1日

Iris Today Archivesの原文(US)

インデックス
Web Site Rule(Web サイト・ルール)文書
敵対的な世界における URL
パスをルールとマッチングする方法
セキュリティーに関する注意
Substitution rule(置換ルール)
Redirection rule(リダイレクト・ルール)
ドミノ R5 からの移行

ご注意:この記事は、ノーツ Rnext ベータ・プログラムで計画・開発されている機能を紹介します。したがって、最終的な機能や UI と、記事中に紹介されるものは異なる可能性があります。

Web サイトがうまく設計されていれば、そのページの利用者は容易にサイトを見て回り、不満やいらいらを感じずに必要な情報を見つけだすことができます。これは利用者を導く多くのリンクやサイトマップによって達成されます。サイトを管理する上で大きな問題は、リンクやサイトマップを最新の状態に保つことです。利用者が最もがっかりするのは、開こうとしたリンクが切れていたときなのです。

Web サイトの構成はとても複雑かつ変化しやすいものですので、内部のリソースを再構成しても URL やリンクを有効なままに維持する方法があることは有用です。サイト管理だけに限らず、このことは Web サイト内の興味をもったページにブックマークしている顧客にとっても利益となります。

Iris Today の記事、ドミノ Rnext で Web アプリケーションを作る:Webサイト・アドレッシングに関するチュートリアルには、ドミノ Rnext で Web サイトをセットアップするための基礎について説明してあります。本記事では、Web サイトの構成を管理するときに助けとなる Web site rule(Web サイト・ルール)の使い方についてみていきます。Web site rule が incoming URL(サーバーが受け取った URL)の解釈を制御する方法を提供することにより、サイト管理が容易になります。ルールには2つの主な使い方があります。
  • サイトの実際の物理的構成からは、独立した、ユーザー・フレンドリーで一貫した操作性のあるページを作成する。
  • すでに存在するリンクやブラウザーのブックマークを壊すことなく、サイトの一部を別の場所へ移したり、構成を変更したりする。

この記事は、ドミノ Rnext を使って Web サイトを立ち上げようと考えている全てのシステム管理者と Web マスターにとって興味深いものとなります。ここでは、ドミノ・ディレクトリーおよびシステム管理の仕事になれていることを前提とします。

Web Site Rule(Web サイト・ルール)文書
Web site rule はドミノ・ディレクトリーにおいて、[Server] - [Internet Sites] ビューのなかで Web サイト文書に対して返答文書を作ることにより定義されます。Web サイトに対して定義された他の情報全てと同じく、ルールはその親サイトに対してのみ適用されます。しかし、ルールは単純な返答文書として実装されているので、同じルールを複数のサイトに適用したいならば、単純にそのルールを別のサイトへコピー&ペーストすればよいのです。

Web Site Rule response(Web サイト・ルール返答)文書は、Web サイト文書のアクション・ボタンから作成することができます。ここでは、www.dominoinc.com 用の Web サイト文書を取り上げます。この文書は、Iris Today の記事、ドミノ Rnext で Web アプリケーションを作る:Webサイト・アドレッシングに関するチュートリアルのなかで作成したものです。

Web site document

このサイトに対してルールを作成するために、[Web Site(Web サイト)] アクション・ボタンをクリックし、[Create Rule(ルールの作成)] を選択してください。すると、新しい Web Site Rule 文書が現れます。

Web Site Rule document

このフォームの [Type of rule(ルールの種類)] フィールドでは、[Directory(ディレクトリー)]、[Redirection(リダイレクト)]、[Substitution(置換)] の3種類から選択できます。この記事では、[Redirection]、[Substitution] のルールについて説明します。[Directory] については今後掲載される記事をご覧下さい。その記事では Web サイトのファイル・システム・リソースをセットアップする方法について説明する予定です。

[Type of rule] フィールドで [Substitution] を選ぶと、フォームには Substitution ルールのためのフィールドが表示されます。

Fields for Substitution rules

[Comment(コメント)] フィールドには、ルールの機能説明や識別などのための任意の文を入力できます。

[Incoming URL pattern] フィールドの内容は、ブラウザーや他の HTTP クライアントから送られるURL と照合するための「テンプレート」です。このパターンには、特別な働きをするワイルドカード文字としてアスタリスク(*)を使うことができます。アスタリスクは、0文字以上の文字列にマッチします。例えば、/shop/* というパターンは、/shop/ で始まるあらゆる URL とマッチします。

[Replacement pattern(置換パターン)] フィールドの内容は、マッチした URL をサーバーが変更する方法を記述するテンプレートです。URL の文字列の内、Incoming pattern にマッチした部分は、Replacement pattern で置き換えられます。Replacement pattern にもワイルドカード文字を利用できます。詳しくは、後述のパスをルールとマッチングする方法のセクションで説明します。例えば、/shop/* というルールに対してReplacement patternが /market/* であったならば、このルールを適用した結果、/shop/pets という URL は /market/pets に置き換えられます。

Type of ruleを Substitution でなく Redirectionに設定した場合は、[Replacement pattern] フィールドの代わりに [Redirect to this URL(リダイレクト先の URL)] というフィールドが表示されます。これもワイルドカードを利用できるテンプレートです。

Incoming pattern と Replacement pattern の使い方を理解する前に、まず、Rnext Web サーバーがどのようにブラウザー・クライアントから送られた URL を処理しているかを知る必要があります。
 
上に戻る
 
敵対的な世界における URL
Web 管理者ならよくご存じのように、インターネットは、いたずら程度のものからサイバー・テロのレベルまで絶えず悪意のある人間による攻撃にさらされています。一部のインターネット・ソフトに脆弱性が発見されると、その脆弱性を狙った攻撃ソフトがすぐに作成され、ばらまかれます。特定の標的に対しての場合もありますが、多くはインターネット全体に対する攻撃です。パブリックな Web サーバーが、他の標的をねらった攻撃によって被害を受けるということもよくあります。特定のソフトをねらった攻撃が他のベンダーのソフトに深刻な影響を及ぼすこともあります。

この敵対的な環境から身を守るために、Rnext Web サーバーの HTTP タスクは、URL フィルタリングと確認の仕組みを実装しています。この手順の目的は、サーバーが受け取った URL の全てについて、それがアプリケーションにわたる前に安全で正しい形に整形することです。HTTP タスクが URL を正しく整形できなかった場合、要求は直ちに拒否され、エラー(一般的には短い簡単なメッセージです。)が送り主に返送されます。

Rnext Web サーバーが URL を受け取ったとき、HTTP タスクはパスを整形するために次の手順を実行します。

1. 全体の長さを調べる
URL の全体の長さを、サーバー文書で指定されている [Maximum URL value(最大 URL 長さ)]( [Internet Protocol] の下の [HTTP] タブ上にあります。)と比較します。この方法によりサーバーは、極端に長い URL を送ってバッファー・オーバーフローの脆弱性を探る攻撃者からの要求を直ちに拒否します。

2. URL を解析する
URL を構成要素に分解します。HTTP URL の一般的な書式は次のようになっています。

http://<host>/<path>?<query>

例えば、次の URL の場合、

http:// www.dominoinc.com/products.nsf/index?OpenPage

www.dominoinc.com が host で、/products.msf が path (先頭のスラッシュ(/)はパスの一部だと考えます)、OpenPage が query (ドミノはクエリー文字列を使って OpenPage や OpenDocument などのデータベース・コマンドを渡します)となります。

3. 16 進数変換文字列の2重変換
URL パスに含まれる 16 進数変換文字列はデコードされ、対応する文字に置き換えられます。例えば、/Smith%26Jones/welcome は /Smith&Jones/welcome になります。Rnext は、従来からの 16 進数変換とともに Unicode 用の UTF-8 エンコードもサポートしています。攻撃者は特定の文字列を複数回エンコードすることにより、サーバーのフィルターをすり抜けようとします。例えば、バックスラッシュ(\マーク)は一回エンコードすると %5c となりますが、この文字列をさらにエンコードすると %25%35%43 となります。このような攻撃を失敗させるために、Rnext HTTP タスクは URL パスをそれ以上デコードできなくなるまで繰り返しデコードします。さらに、デコーダーが無効な 16 進数文字列 あるいは無効な UTF-8 の列を発見したら、直ちにその要求は拒否されます。CodeRed と Nimda ワームは、スラッシュを表すために %c0%af という「長すぎる」 UTF-8 文字列を利用します。Rnext は、長すぎる列を含む URL があれば拒否します。

4. ディレクトリー・ナビゲーション・シーケンスを解決する
URL 中の全てのディレクトリー・ナビゲーション・シーケンスが解決されます。スラッシュもバックスラッシュ(\マーク)も、パスの区切り文字として解釈され、複数が連続している場合は無視されます。例えば、/abc/..\\xyz/.//123 は /xyz/123となります。Rnext HTTP タスクは、この「逆誘導」を前もって行いますので、攻撃者がドミノ HTTP ルート・ディレクトリーの外へ出ることは不可能です。Windows ではデフォルトのルート・ディレクトリーは、nsf 要求に対しては c:\Lotus\Domino\Data であり、ファイル・システム要求に対しては c:\Lotus\Domino\Data\domino です。

例えば、Nimda ワームは cmd.exe を実行するために、
"/scripts/..%255c..%255cwinnt/system32/cmd.exe" という URL パスをサーバーに送ります。Rnext はこのパスを /winnt/system32/cmd.exe へデコードし、逆誘導します。これはファイルシステム要求のように見えるので、ドミノはこのパスを HTML ルート・ディレクトリーへ適用し、実際にはc:\Lotus\Domino\Data\domino\html\winnt\system32\cmd.exe というファイルを探します。もちろんこのファイルは存在しません。したがって、HTTP タスクは Error 404 - File Not Found という応答をこの攻撃に対して返します。

5. セグメントの個数を確認する
URL パスを構成するセグメントの個数を、サーバー文書で設定されている「Maximum number of URL Path Segments(URL パスセグメントの最大個数)」([Internet Protocol] タブの下の [HTTP] タブ上に位置しています)の値と比べて確認します。これは、サーバーのファイル・システム・コードを極端に多くの個数のパス・セグメント(例えば、/a/b/c/d/e/f/g/h/i/j/k...)で圧倒しようとする攻撃を防ぎます。
 
上に戻る
 
パスをルールとマッチングする方法
サーバーが受け取った URL を整形した後、HTTP タスクは、Web サイトがその URL を変更する必要があるかどうかを決定するために定義されたルールをスキャンします。URL パスだけがパターン・マッチングに用いられます。クエリー文字列はアプリケーションのために別に保存しておきます。そのため、ルールの Incoming URL pattern フィールドに指定されたパターンに、ホスト名やクエリー文字列を含めてはいけません。マッチングは整形されたパスに対して行われるので、生の URL のあらゆるバリエーションに対応するマッチングを行おうとする必要はありません。例えば、Smith&Jones の Welcome ページにマッチさせたい場合、単に /Smith&Jones/welcome をルールとして指定すればよいのです。/Smith%26Jones/welcome や /Smith%26Jones/./welcome 等の URL のために別途ルールを作る必要はありません。

上で述べたとおり、パターンには、0文字以上の文字列にマッチするアスタリスク(*)ワイルドカード文字を含めることができます。例えば、パターン /petstore/*dogs を指定したなら、これにマッチする URL のうち最短のものは /petstore/dogs であり、/petstore/ で始まり dogs で終わるあらゆるパス、例えば /petstore/aisle/bigdogs にマッチします。

さらに、パターン・マッチングでは大文字と小文字は区別しません。/petstore/*.nsf というパターンは、/petstore/specials.nsf にも /PetStore/Specials.NSF にもマッチします。

Replacement pattern や Redirection pattern でもワイルドカードは利用できます。これらのワイルドカードは、Incoming URL pattern の対応するワイルドカードにマッチしたパスの一部分で置き換えられます。例えば、次の置換ルールを考えます。

Comment:Product specials database
Type of rule:Substitution
Incoming URL pattern:/*/specials/*
Replacement pattern:/*/specials.nsf/by*?OpenView

このルールでは、/petstore/specials/month というパスは /petstore/specials.nsf/bymonth?OpenView へ変換されます。

Replacement pattern がクエリー文字列 ?OpenView を含んでいることに気づくことと思います。上で、クエリー文字列は Incoming pattern に含めてはいけないと説明しましたが、Replacement pattern に含めることは可能です。新しい URL に Replacement pattern によってクエリー文字列を追加した場合、もとの URL に含まれていたクエリー文字列は上書きされます。

Substitution rule は Redirection rule より優先順位が高くなっています(また Redirection rule は Directory rule より優先順位が高くなっています)。Web サイトに対する Substitution rule と Redirection rule は別のテーブルに保持されます。それぞれのテーブルのなかでは、ルールは Incoming URL pattern の長い順に並んでいます。これは、より限定的なルールが先にマッチすることを保証します。例えば、次の2つのルールを作ったとします。

Comment:モール・ページ一般
Type of rule:Substitution
Incoming URL pattern:/mall/*
Replacement pattern:/mall.nsf/*?OpenPage

Comment:各店舗に対応してそれぞれ nsf ファイルがある
Type of rule:Substitution
Incoming URL pattern:/mall/*/*
Replacement pattern:/*.nsf/*?OpenPage

URL パス /mall/pets/welcom は長い方のパターンにマッチし、/pets.nsf/welcome?OpenPage に変換されます。一方、パス /mall/welcom は短い方のパターンにマッチし、/mall.nsf/welcom?OpenPage に変換されます。

URL パスを整形した後で、HTTP タスクは初めに Substitution rule テーブルを検索します。マッチング・ルールが見つかったら、タスクは、Replacement pattern から新しい URL を生成し、パスを再度整形します。

つぎに、HTTP タスクは Redirection rule テーブルに対してパターンとのマッチングを試みます。後述の Redirection rules セクションで説明するように、Redirection には2つの種類があり、ブラウザーへ送り返される external(外部)と、サーバー内で処理される internal(内部)のいずれかです。パスが external redirection rule(外部リダイレクト・ルール)にマッチしたら、HTTP タスクは、Redirection pattern に基づいて新しい URL を生成し、直ちにその URL をブラウザーへ返します。パスが Internal redirection rule(内部リダイレクト・ルール)にマッチしたら、HTTP タスクは新しいパスを生成し、パスを整形し、再度 Redirection rule テーブルを検索します。HTTP タスクがこのように Redirection rule テーブルを再帰的に検索するために、それ以前にどんな置換やリダイレクトが適用されたかにかかわらず URL をとらえる broad-based redirection rule(広範囲をベースとしたリダイレクション・ルール)を書くことができるようになっています。再帰的に検索を行うということは、間違って互いにマッチしあう Redirect rule を書いた場合、無限ループに陥る可能性があるので、HTTP タスクは再帰回数の制限を 10 回としています。
 
上に戻る
 
セキュリティーに関する注意
私達はここまでで Web サイト・ルールの基礎については十分に見てきましたので、置換とリダイレクトの詳細について掘り下げる準備が整いました。しかし、まず、セキュリティーに関する非常に重要な注意を述べておきます。

セキュリティーを実施するためにルールを使わないでください!

ルールが Incoming URL パスを変換するので、サイトのセキュリティーの一部としてルールを使おうとお考えになるかも知れませんが、これは行わないでください!

ルールは Web マスターのための管理機能です。ルールはセキュリティー機能ではありません!ルールを Web サイトの一部を隠すために使うと、「セキュリティーを混乱させる」という罪を犯したことになります。これはまったくセキュリティーのない状態であるということが、何度も繰り返し証明されています。実際、これは見せかけのセキュリティーを提供するので、セキュリティーのない状態よりも悪いかも知れないのです。あなたが他の事柄に不注意になってしまう可能性が非常に高いのです。

例を一つあげておきます。Rnext Web サーバーが、内部ユーザー向けと一般公開用のサイトを両方、ホスティングしているとします。内部データベースはすべてサブディレクトリー data\internal にあり、公開用のデータベースはすべて data\public にあるとします。2つの Web サイトは、一般ユーザー向けに www.myco.com、内部ユーザー向けに internal.myco.com としてあります。internal.myco.com は、クライアント証明書を利用した SSL アクセスのみを許可していて、非常にセキュアーなサイトになっています。認証されていないユーザーは internal.myo.com にアクセスできないことが分かっているので、あなたは、データベース ACL を data\internal にある全てが Anonymous アクセスを許可するように設定することにより、管理における悩みの種をなくすことができると考えます。これらのデータベースに対する一般のユーザーからのアクセスを防ぐために、www.myco.com に対してリダイレクト・ルールを作り、/internal/* を指定する全ての URL がエラー・ページにリダイレクトされるようにします。これで内部データベースは安全です。本当でしょうか?

間違っています!セキュリティー上の大間違いを犯しています。まず、あなたはデータベースがレプリカ ID によって Web からアクセスできることを忘れています。例えば、internal\names.nsf は http://www.myco.com/85256ab40043144e?OpenDatabase によってアクセスされるかも知れません。レプリカ ID は 16 進数の文字列ですが、それが本当にランダムになっていないこと、および今日の安価なコンピューター・パワーと帯域の広い通信網があることから、多くの要求によってサーバーを攻撃し有効なレプリカ ID を見つけることは攻撃者にとって何でもないことです。第2に、データベースを移動したりデータベースの名前を変更したりすることにより、セキュリティーを自ら弱めてしまうかも知れません。internal\specs.nsf から planning\specs.nsf へ移動したときに、internal.myco.com に対するリンクとルールを修正することは忘れないでしょうが、www.myco.com に対するリダイレクト・ルールを修正することは忘れてしまう可能性があります。すると、http://www.myco.com/planning/specs.nsf を要求しても、そのデータベースを開くことはできなくなります。

この例からわかる教訓は明快なものです。すなわち、サイト上のリソースを保護する必要があるならば、そのリソースに設定したセキュリティーで保護するべきであるということです。ルールや推測しにくい名前などの混乱のもととなるものを利用してリソースを「隠そう」とするべきではありません。データベースとドキュメントに対する ACL などのドミノが提供する本当のセキュリティー機能のみを利用すべきです。

ところで、この教訓は、ドミノに限らずどんな Web サーバーに対しても成り立ちます。どんな Web サーバーの設定機能も混乱した状態に頼っているものはセキュアーだとは言えません。これを理解した上で、他の種類のルールについて詳しく見ていきましょう。
 
上に戻る
 
Substitution rule(置換ルール)
Substitution rule の目的は、サーバーが受け取った URL パスの一部を別の文字列で置き換えることです。Substitution rule を利用する状況には主に2つあります。
  • サイトの構成を変更する必要があるが、サイト内のリンクを全て書き替える作業はしたくない。
  • 複雑な URL にユーザー・フレンドリーな別名を作りたい。
Substitution が効果を発揮するいくつかの一般的な事例を見てみましょう。

例1:サイト内でファイルを移動する
ドミノデータベースを "shopping" ディレクトリーから "market" ディレクトリーへ移動する場合を考えてください。サイト内のページには、shopping ディレクトリーを参照する多くのリンクがあり、例えば次のようなものです。

<a href="/shopping/products.nsf">Browse our products</a>

もちろん、products.nsf を新しいディレクトリーへ移動した後には、このリンクは切れてしまいます。これを修正するには、手動で次のようにリンクを更新することもできます。

<a href="/market/products.nsf">Browse our products</a>

しかし、修正すべきリンクがたくさんあったら、この作業は非常に時間がかかり、エラーが起こりやすくなります。この問題を解決するもっと簡単な方法は、古いディレクトリーを新しいディレクトリーに対応させる Substitution rule を作ることです。

Comment:サイト・データベースを "shopping" から "market" へ移動
Type of rule:Substitution
Incoming URL pattern:/shopping/*
Replacement pattern:/market/*

このルールを設けることで、ユーザーが次のリンクをクリックした場合は、

<a href="/shopping/products.nsf">Browse our products</a>

サーバーは URL を次のように変換します。

/market/products.nsf

例2:ドミノによらないサイトをドミノへ変換する
単純なショッピングモール Web サイトを考えてください。そのサイトのコンテンツは、ショッピング・モールの各店舗に対応するディレクトリーに保存された HTML ファイルだとします。この基本的な方法によるサイトをドミノへアップデートし、HTML ファイルをドミノ・ページにコピーして、各店舗に対するドミノデータベースを作ったとします。前の例と同じく、これによりページ内のスタティック・リンクは切れてしまいます。しかし、データベースの名前をもとのディレクトリー名と同じにしてあって、ページの名前をもとのファイルの名前と同じにしてあれば、サイト全体に適用できる次のような Substitution rule をひとつ作れば済みます。

Comment:"stores" ファイルからドミノ・ページへ変換
Type of rule:Substitution
Incoming URL pattern:/stores/*/*.html
Replacement pattern:/stores/*.nsf/*?OpenPage

このルールでは複数のワイルドカードを使っています。初めのワイルドカードはディレクトリー名をデータベース名へ変換し、2番目のワイルドカードはファイル名をドミノ・ページの名前へ変換します。例えば、ユーザーが次のリンクをクリックした場合は、

<a href="/stores/petstore/welcome.html">Petstore</a>

ここで指定されている URL は次のように変換されます。

/stores/petstore.nsf/welcome?OpenPage

例3:複雑な URL に対して別名を作る
Substitution rule を使って、非常に複雑な URL に対して単純なブックマークを対応させることができます。次のルールは検索要求に対して別名を作ります。

Comment:一般的な製品検索の別名
Type of rule:Substitution
Incoming URL pattern:/find/*
Replacement pattern:/allsearch.nsf/products?searchview&query=*

このルールを実装すると、次のような簡単な HTML リンクを作成できます。

<a href="/find/deals">What's on Sale</a>

サーバーはこれを次のように変換します。

/allsearch.nsf/products?searchview&query=deals

Substitution rule におけるワイルドカード
Substitution rule における Incoming pattern と Replacement pattern にはそれぞれ最低1つずつワイルドカードを指定しなくてはなりません。パターンの中にワイルドカードがない場合、HTTP タスクはルールを内部テーブルに書き込む際に、そのパターンの末尾に自動的に "/*" を追加します。次のルールを例にとります。

Incoming URL pattern:/shopping
Replacement pattern:/market

これは、次に示すルールと同じことを意味します。

Incoming URL pattern:/shopping/*
Replacement pattern:/market/*

(末尾のワイルドカードが明示的に指定されたか、ドミノによって追加されたかにかかわらず)"/*"で終わるパターンは、URL の末尾にスラッシュがあるか否かにかかわらず、URL のそれ以外の部分がマッチしていれば、その URL にマッチします。これは、ディレクトリーを再割当てするためのルールがそのディレクトリーで終わる URL にマッチすることを保証します。例えば、上のルールはサーバーが受け取った URL を次のように対応づけます。
  • /shopping/petstore を /market/petstore へ対応させる。
  • /shopping/ を /market/ へ対応させる。
  • /shopping を /market へ対応させる。
 
上に戻る
 
Redirection rule(リダイレクト・ルール)
先にも述べたとおり、Redirection rule には2種類あり、External redirection(外部リダイレクト)と Internal redirection(内部リダイレクト)です。External redirection rule を利用するのは、Web サイト・リソースの場所が変わった場合で、ブラウザー側で新しい場所が分かるようにしたい場合です。Internal redirection rule を利用するのは、ブラウザー側に新しい場所が分からないようにしたい場合です(このようにする目的はサイト内の案内のためであって、セキュリティーのためでないことに注意してください。上でも述べたとおり、サイトのセキュリティーをルールに頼ることは絶対に行わないでください)。

Redirection rule の2種類は、Web Site Rule 文書の [Redirect to this URL(リダイレクト先の URL)] フィールドで区別できます。このフィールドのパターンがスラッシュで始まっていたら(例えば、/welcome.nsf)、そのルールはInternal redirectionとしてあつかわれます。そうでなければ、ルールは External redirection としてあつかわれます。External redirection のためのパターンは、ブラウザーが理解できるインターネット・プロトコル文字列で始まる必要があります。通常は http: あるいは https: ですが、ftp: のような他のプロトコルにすることもできます。

Redirection rule のなかでワイルドカードを使うことはできますが、必要なものではありません。Substitution rule ではワイルドカードが最低1つ必要で、明示的にワイルドカードを指定しない場合は Rnext は "/*" を追加するようになっています。しかし、Redirection rule に対してこれを行うことはありません。URL との厳密なマッチングをしたい場合があるからです。これに関する一般的な例について、次で説明します。

External redirection(外部リダイレクト)
External redirection rule の場合、サーバーはブラウザーに、ブラウザーが要求したファイルあるいはリソースが、今は別の URL にあることを知らせます。すると、ブラウザーは自動的に新しい URL に対する要求を発行します。これは、ブラウザーのアドレスボックスの URL が新しい URL に変わること以外は、ブラウザーのユーザーに対する影響はありません。さらに、ユーザーがそのページにブックマークしていたら、そのブックマークは新しい URL を使うことになります。

例1:Web サイトを移動した際の External redirection
External redirection rule を使うのは、Web サイトの一部または全てを別のサイト(普通は、関連したサイト)へ移動したときです。External redirection を使うことによって、既存のリンクやブックマークをそのまま利用できる状態に維持できます。一方で、新しくブックマークを作るとそれは新しい場所を指します。

例えば、あなたが SpendBucks.com の Web 管理者だった場合を想定してください。このサイトは仮想店舗のホスティングを専門に行うサイトです。あなたのクライアントである Fluffy Pets, Inc. が、現在 http://SendBucks.com/FluffyPets にある仮想店舗の重要なアップデートをあなたに頼むことにしました。アップデートの一環として、あなたは Fluffy Pets 社のサイトのドメインとして、Fluffy Pets 社専用のドメイン "fluffypets.com" をホスティングサーバーに割り当てて利用することにしました。しかし、Fluffy Pets 社の既存の顧客の多くは古いサイトへブックマークしています。さらに、Fluffy Pets 社の現在のバナー広告や他のメディアによる広告の全てを変更して新しいサイトのアドレスを掲載するようになるには時間がかかります。古くなったリンクをたどってくる人々が新しいサイトを見つけられるようにするには、どのようにすればよいのでしょうか? External redirection rule を作成することにより、スムーズに移行できるようになります。

Comment:FluffyPets 社の新しいサイト
Type of rule:Redirection
Incoming URL pattern:/fluffypets/*
Redirect to this URL:http://fluffypets.com/*

顧客がクリックしたブックマークまたはバナー広告が、次の URL のサイトを指していると、

http://spendbucks.com/fluffypets/welcome.nsf

サーバーはブラウザーを次の URL へリダイレクトします。

http://fluffypets.com/welcome.nsf

もとの URL がクエリー文字列を含んでいたら、それは自動的にリダイレクト先の URL に追加されます。例えば、サーバーが受け取った URL が http://spendbucks.com/fluffypets/products.nsf?Open ならば、リダイレクト先の URL は http://fluffypets.com/products.nsf?Open となります。また、[Redirect to this URL] フィールドのパターンに新しいクエリー文字列を含めることにより、もとのクエリー文字列を置き換えることもできます。

例2:プロトコルを変更するための External redirection
上で述べたとおり、External redirection はどのプロトコル文字列で初めてもかまいません。そのため、External redirection を使って、要求のプロトコルを変更することができます。一般的なのは、ユーザーを通常のサイト(http:)から SSL サイト(https:)へリダイレクトする場面です。例えば次のとおりです。

Comment:セキュアーな登録用サイトへリダイレクト
Type of rule:Redirection
Incoming URL pattern:/*/register.jsp
Redirect to this URL:https://secure.spendbucks.com/*/register.jsp

このルールを使うと、顧客が spendbucks.com の仮想店舗のどこで登録したいと思っても、SSL サイトへリダイレクトされます。例えば、ユーザーが次に示すリンクをクリックした場合、

<a href="/gasguzzler/register.jsp">Tell Us Everything About Youself!<\a>

サーバーはブラウザーを次のセキュアーなサイトへリダイレクトします。

https://secure.spendbucks.com/gasguzzler/register.jsp

例3:ポート変更のための External redirection
External redirection を使って、ターゲット・サイトの別のポートへリダイレクトすることもできます。(通常、ターゲット・サイトはポートが違うだけでもとのサイトと同じです。)次に設定の例を示します。

Comment:アプリケーションはポート 8008 を利用
Type of rule:Redirection
Incoming URL pattern:/account.nsf/*
Redirect to this URL:http://spendbucks.com:8008/account.nsf/*

技術的詳細について
技術的な観点から言えば、External redirection によりサーバーは、HTTP ステータス・コード 302 と新しい URL を書き込んだ Location ヘッダーを返します。最近のブラウザーは全て外部リダイレクトをサポートしていますが、古いブラウザーの中にはステータス 302 を認識できないものや、空白ページを表示したりエラー・メッセージを表示したりするものもあります。

External redirection にはとても重要な性質がありますので、覚えておく必要があります。データ(入力フォームにユーザーが記入したものなど)を含んでいる要求をリダイレクトした場合、そのデータをリダイレクト先のサイトに送るかどうかはブラウザーの処理に依存します。そのため、External redirection は GET あるいは HEAD メソッドを使った HTTP 要求に対してのみ用いることが最も安全です。リダイレクトを POST(フォーム送信)や WebDAV などの他のメソッドに対して用いる場合は、クライアントが使用しているブラウザーでリダイレクトのテストを注意深く行う必要があります。

また、Rnext は新しい URL の解釈を完全にブラウザーに任せているため、その構文が正しいかどうかは関知しません。Rnext が求めることは、Redirection pattern の先頭がスラッシュか否かということだけです。先頭がスラッシュでなければ、リダイレクトはブラウザーへ送信されます。したがって、標準プロトコル以外を使う場合は、クライアントのブラウザーでリダイレクトのテストを注意深く行う必要があります。

Internal redirection(内部リダイレクト)
Internal redirection rule は、HTTP タスクが新しい URL を生成し再度整形する Substitution rule と非常によく似た働きをします。しかし、相違点が2点あります。第1は、Redirection テーブルの検索が再帰的に行われるので、Redirection rule を「入れ子」にすることができる点です。第2は、Internal redirection がワイルドカードを必要としないので、Substitution rule の代わりに使って URL パスとの厳密なマッチングを行わせることができる点です。ところで、「厳密なマッチング」というときには、ルールのマッチングが、完全に整形されたパスについて、大文字小文字の区別なく行われることを念頭に置いてください。

厳密なマッチングが必要なケースはそれほど多くはありません。しかし、あるケースはとても一般的なので、Web サイト文書のオプションとして用意されています。ブラウザーのユーザーが Web サイトのホームページを開きたいだけの場合、ユーザーは通常、ホスト名(例えば、www.dominoinc.com)をブラウザーのアドレス・バーに入力します。ブラウザーはこれを http://www.dominoinc.com/ という URL に変換します(ブラウザーのアドレス・バーがこの URL に更新されるのを実際にご覧になった方もいるかも知れません)。変換後の URL では、パスに当たる部分はスラッシュ "/" だけです。つまり、ターゲット・サーバーは "/" という URL パスを「ホームページを開く」こととして解釈する必要があります。

Rnext では、ホームページは Web サイト文書の [Configuration] タブにある [Home URL] フィールドで指定します。Rnext HTTP タスクは、このフィールドを使って自動的に Redirection rule を作ります。例えば、このフィールドを /welcome.nsf に設定したら、Rnext は次のような Redirection rule を作ります。

Comment: 
Type of rule:Redirection
Incoming URL pattern:/
Redirect to this URL:/welcome.nsf

Rnext が作るルールは、 Substitution rule でなく Redirection rule であることに注意してください。これは、Substitution rule が必ずワイルドカードを含むものであって、ここで考えているルールは "/" という URL パスだけにマッチする必要があるからです。それ以外の、/cgi-bin/contact.pl や /products.nsf にマッチしては困るからです。

ワイルドカードは Internal redirection において必須ではありませんが、[Incoming URL pattern] と [Redirect to this URL] フィールドの両方で使うことができます。しかし、Substitution を使えば済むので、それを行う意味はあまりありません。また、Internal redirection を GET あるいは HEAD 以外の要求に対して用いることはできません。
 
上に戻る
 
ドミノ R5 からの移行
すでに R5 Web サーバーがある場合、すでにドミノ・ディレクトリーの [サーバー] - [Web 設定]([Server] - [Web Configurations])ビューで定義したルールがあるかも知れません。サーバーを Rnext へアップデートする計画でしたら、すでにあるルールがどのように解釈されるかに疑問をお持ちでしょう。Rnext は R5 と同じだけのルールの種類をサポートしていますが、混乱を防ぐために用語を変えてあります。新旧の用語を示します。

R5Rnext
URL->URL Substitution(置換)
URL->RedirectionRedirection(リダイレクト)
URL->Directory Directory(ディレクトリー)

Rnext HTTP タスクは、R5 よりもシステマティックにルールを処理します。R5 では、3種類のルールが1つのテーブルに特に決まった順序なしに保存されていました(大まかには作成順ですが必ずしもそうでないものもあります)。Rnext では、ルールの種類毎にテーブルがあり、Incoming URL pattern の長い順に並んでいます。これにより、Rnext ではルールの適用が分かりやすくなります。

Rnext HTTP タスクは、古い [サーバー] - [Web 設定] ビュー、あるいは新しい [Server] - [Internet Sites] ビューの2つのドミノ・ディレクトリー・ビューからいずれかを利用できます。Rnext サーバーで古いビューを使う場合も、ルールは別々のテーブルに並んで保存されます。通常これが問題になることはありませんが、たくさんルールがあったり、よく似たパターンのルールがあったりする場合は、アップデート後に全てのルールを注意深くテストする必要があります。

この記事では、3種類のルールのうち Substitution と Redirection の2種類について説明し、それがどのようにサイト管理に役立つかについて例を紹介しました。Directory rule については、今後の別の記事で紹介いたします。



著者について
ジョン・チェンバレンは、ドミノ Rnext Web サーバー・チームのソフトウェア品質面でのアーキテクトです。
 
上に戻る