Logo address

httpd.rewrite

目次

2003/02/11 改訂

配置

	/sys/lib/httpd.rewrite

機能

このファイルは2つの役割を担っています。

ケーススタディ

以下の説明では、このサーバのドメイン名を
	pegasus.goodwill.com
とします。ここに登場するのは5人のシステムユーザの名前で、それらは
	alice
	bob
	carol
	david
	emily
である。

URI

まず URI について簡単に解説します。
HTTP の URI (または URL) は次のように定義されています。
	scheme://host[:port][/path][;params][?query]
ここに

URI の中ではユーザのドキュメントは習慣的に ~user で始まるパスで表現されます。ここに user はシステムのユーザ名です。すなわち、~user はドキュメントルートの下にあるディレクトリとして URI の中で表現されますが、サーバの実装としては必ずしもそのようにする必要はありません。むしろユーザのドキュメントは各ユーザのホームディレクトリの下にあった方がユーザにとって web ページを作成しやすいでしょう。(Apache でも実際にそのようになっています。)

/sys/lib/httpd.rewrite

まずケーススタディに沿った /sys/lib/httpd.rewrite の設定例を挙げましょう。
# pattern        replacement
http://car       */usr/carol/www
https://car      */usr/carol/https
/~david          http://www.eecs.harvard.edu/~david
/~emily         */usr/bob/www_removed
/                */usr/bob/www
さらに /usr/bon/www/etc/rewrite には
/private         https://pegasus.goodwill.com/private
を書きます。
ファイル /sys/lib/httpd.rewrite はコメント行(# で始まる行)を除けばどの行も2つのフィールドから構成されます。(フィールドは空白文字で区切られています)
第1フィールドはリクエストのパターンを表しています。リクエストされる schemehttphttps だけです。また host は、実ホストまたは仮想ホストの名前です。(完全名ではないことに注意します。)


第1フィールドが / で始まる場合には実ホストと実ホストのユーザに対する要求であるとみなします。すなわち、scheme://host[:port] が省略されているとみなします。ここに host は実ホストの名前である。

第2フィールドは、


第2フィールドが / で始まる場合のサポートは次回に回します。現在はこの場合には、第1フィールドと同一の scheme://host[:port] が省略されたと見なされます(第1フィールドが / で始まる場合には、第1フィールドにマッチすることによって受け入れられた scheme://host[:port] が省略されたと見なされます)。しかしこれを仕様として固定するまえに、ニーズについて検討を加えたいと思います。

要求された URI が第1フィールドにマッチした場合、第2フィールドが * で始まるか否かによって処理が異なります。

この例を見ながらさらに次のことを理解してください。
パターン照合は以下のルールで行われます。

従って第1フィールドが / だけの行は最後に置きます。これは必須です。

/sys/lib/httpd.rewrite の中にマッチするものがなければ実ホストのユーザに対するリクエストである可能性が調べられます。

実ホストや仮想ホストの web ルートの指定

Pegasus は他の web サーバと異なり、実ホストや仮想ホストやユーザごとに、web のコンテンツはもちろん、コンテンツに対するアクセス制御ファイルや、CGI のための実行ファイルを持つことを許します。
web にドキュメントを公開しているどのシステムユーザにも web ルート(root) が割り当てられ(以下このディレクトリを $web で表す)、その下に docetcbin を持つことができます。doc はドキュメントの置き場所、etc はアクセス制御ファイル(rewrite, allow, passwd, handler など)の置き場所、bin は実行ファイルの置き場所です。

Pegasus は /sys/lib/httpd.rewrite の中で web ルートの設定を行っています。例えばこの実ホストのページは bob が管理し、仮想ホスト car のページは carol が管理しているとします。この場合には第二フィールドで * に続けて実ホストとや仮想ホストの web ルートを指定します。
先の例では、

http://car      */usr/carol/www
https://car     */usr/carol/https
/               */usr/bob/www
となっています。この場合には仮想ホスト car のために carol は2つの web ルート (/usr/carol/wwwusr/carol/https を与えられたことになります。
システムのユーザは(alicebobcarol も) /sys/lib/httpd.rewrite で特に設定しなくても $home/web/doc を持っていれば、自動的に $home/web が web ルートになり、$home/web/doc の下にあるドキュメントはクライアントからは
	http://pegasus.goodwill.com/~alice
でアクセスできるようになります。(この自動化は httpd のオプションで取り消すこともできます。)


注意: 仮想ホストの名称は、DNS サーバに登録する必要があります。

2003/02/11 追加

URI リダイレクション

URI リダイレクション とは、サーバへのクライアントからのリクエストに対して、他のリクエストを行うようにクライアントに指示する機能です。この機能は、間違った URI に基づくリクエスト対して正しい URI をクライアントに教えるのに使用されます。
例えばシステムのユーザ david が他のホスト(http://www.eecs.harvard.edu) に引っ越しをした場合を考えてみましょう。この場合には /sys/lib/httpd.rewrite
/~david		http://www.eecs.harvard.edu/~david
と書くことによって、アクセス先の変更を指示します。(多分 david は引っ越し先に、このシステムの彼のデータをそのままコピーしている事が予測されます。クライアントはおそらく david の何かのファイル(これを /path/to/some/file とします)をリクエストしているでしょう。その場合の URI は
	http://pegasus.goodwill.com/~david/path/to/some/file
の形をとります。すると Pegasus はクライアントに対して
	http://www.eecs.harvard.edu/~david/path/to/some/file
にアクセスするよう指示します。file が CGI の場合には、引数や query も リダイレクション の対象に含められます。
注意: bob が引っ越し先でディレクトリの構成を変更しているのであれば第2フィールドを
	http://www.eecs.harvard.edu/~david;
にしておくのが無難でしょう。引っ越し先のサーバが Pegasus と異なる場合には ";" に続く部分は(多分)無視されるので、単に david の ホームページが表示されます。引っ越し先のサーバが Pegasus と同様に ";" を認識していれば、david は Pegasus からのリダイレクションを適切に処理する手段を持つことになります。(";" については、次の emily を参照してください。)

個別の吟味

emilywww_removed

/~emily         */usr/bob/www_removed
さて、この www_removedemily が削除されたことを知らせる案内を置くディレクトリです。案内は
	/usr/bob/www_removed/doc/index.html
に置かれています。
emily が削除された事を知らないクライアントは
	http://pegasus.goodwill.com/~emily/photo/
のように、彼女のドキュメントへのパスを付加してサーバに要求するかもしれません。www_removed はこうした全てのリクエストを拾う必要があります。そのためには
	/usr/bob/www_removed/etc/handler

	*	text/html		0	/bin/announce
のように設定し announce でそれを実現すればよいでしょう。

/usr/bob/www/etc/rewrite

ファイル /usr/bob/www/etc/rewrite/sys/lib/httpd.rewrite の処理が終わってから読みとられます。このファイルに現れた
/private		https://pegasus.goodwill.com/private
に関する考察は $web/etc/rewrite を見てください。

パス名のマッチング

httpd.rewrite で使用されているパス名の適合規則は単なる部分文字列を見ているわれではありません。ディレクトリの区切りをみています。

/sys/lib/httpd.rewrite の形式

一般規則

メタ記号

第1フィールドの形式

第1フィールドは以下の2つのうちのいずれかです。
	1.  scheme://host[:port]
	2.  /path

ここに

次の制約を守ってください。

第2フィールドの形式

第2フィールドは以下の2つのうちのいずれかです。

	1.  scheme://hostdom[:port][/path][;params][?query]
	2.  */path

ここに