httpd.rewrite
目次- 1.0.0 配置
- 2.0.0 機能
- 3.0.0 ケーススタディ
- 4.0.0 URI
- 5.0.0
/sys/lib/httpd.rewrite - 6.0.0 実ホストや仮想ホストの web ルートの指定
- 7.0.0 URI リダイレクション
- 8.0.0 個別の吟味
- 8.1.0
emilyのwww_removed - 8.2.0
/usr/bob/www/etc/rewrite - 9.0.0 パス名のマッチング
- 10.0.0
/sys/lib/httpd.rewriteの形式 - 10.1.0 一般規則
- 10.2.0 メタ記号
- 10.3.0 第1フィールドの形式
- 10.4.0 第2フィールドの形式
2003/02/11 改訂
配置
/sys/lib/httpd.rewrite
機能
このファイルは2つの役割を担っています。- 実ホストや仮想ホストの web ルートを指定する
- URI の変換規則を定義する
ケーススタディ
以下の説明では、このサーバのドメイン名をpegasus.goodwill.comとします。ここに登場するのは5人のシステムユーザの名前で、それらは
alice bob carol david emilyである。
alice
pegasusに自分のページを持ちたいと考えている。すなわち次の URI を持ちたいと考えている。
http://pegasus.goodwill.com/~alice
bob
実ホストのドキュメントを管理している。このドキュメントの URI は
http://pegasus.goodwill.com
であるが、http://pegasus.goodwill.com/privateへのアクセスは、httpではなく、httpsを使用すべきであると考えている。
carol
このサーバ上に仮想ホストcar.goodwill.comを持ち、販売に役立てたいと考えている。
httpとhttpsの両プロトコルを利用し、クライアントからは
http://car.goodwill.com
https://car.goodwill.com
としてアクセスしてもらいたい。そして、httpsによるアクセスは、セキュリティ上の理由により、httpでサービスするディレクトリとは独立したディレクトリで処理を行いたいと考えている。
david
かってこのサーバのユーザであったが、現在ではhttp://www.eecs.harvard.edu/~davidに彼のホームページを持っている。bobは彼のドキュメントにアクセスするクライアントに対して、davidの新しい URI にアクセスされるようにしたいと考えている。
emily
かってこのサーバのユーザであったが、現在は存在しない。bobは彼女へのアクセスがあった場合にはクライアントに対して、このユーザが削除されたことを伝えたいと考えている。
URI
まず URI について簡単に解説します。HTTP の URI (または URL) は次のように定義されています。
scheme://host[:port][/path][;params][?query]ここに
[ ]はメタ記号で省略可能であることを表します
schemeは HTTP の場合にはhttpですが、暗号プロトコル SSL が使用されている場合にはhttpsとなります
- Pegasus は
paramsを CGI の引数、queryを CGI に渡す環境変数として扱っています。この扱いはサーバに依存しています。paramsやqueryの形式はここでは問題にする必要はありません。(空白文字を含まない事だけを知っていればよいでしょう)
hostは、クライアントがこの IP アドレスを知っていることが必要であり、通常は DNS サーバに登録してしておきます
portが省略されるとhttpの場合には 80、httpsの場合には 443 が仮定されます
pathはサーバのドキュメントルートからのファイルの相対パスです
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フィールドはリクエストのパターンを表しています。リクエストされる
scheme は http と https だけです。また host は、実ホストまたは仮想ホストの名前です。(完全名ではないことに注意します。)
第1フィールドが
/ で始まる場合には実ホストと実ホストのユーザに対する要求であるとみなします。すなわち、scheme://host[:port] が省略されているとみなします。ここに host は実ホストの名前である。
第2フィールドは、
*で始まる場合には、web ルートが指定されています
schemeで始まる場合には、この URI にクライアントを誘導します
第2フィールドが
/ で始まる場合のサポートは次回に回します。現在はこの場合には、第1フィールドと同一の scheme://host[:port] が省略されたと見なされます(第1フィールドが / で始まる場合には、第1フィールドにマッチすることによって受け入れられた scheme://host[:port] が省略されたと見なされます)。しかしこれを仕様として固定するまえに、ニーズについて検討を加えたいと思います。
要求された URI が第1フィールドにマッチした場合、第2フィールドが * で始まるか否かによって処理が異なります。
- 第2フィールドが
*で始まる場合には、リクエストは第2フィールドで指定された名前空間に渡されます。
- 第2フィールドが
*で始まらない場合には、マッチした残りの部分が第2フィールドに追加され、その結果が(リダイレクションループにならない場合には)クライアントに通知されます。
httpやhttpsで始まる行は仮想ホストと実ホストの変換規則である
/~で始まる行は実ホストのユーザの変換規則である
/で始まり、/~では始まらない行は実ホストの変換規則である
- まず
schemeで始まる行について行われ、マッチしない場合にはさらに/で始まる行に対して行われる
- その際、照合は上の行から下の行に向かって行われる
- そしてマッチする行があれば終える
- 但し
/pathが/~で始まる場合には/にマッチするとはみなさない
従って第1フィールドが
/ だけの行は最後に置きます。これは必須です。
/sys/lib/httpd.rewrite の中にマッチするものがなければ実ホストのユーザに対するリクエストである可能性が調べられます。
実ホストや仮想ホストの web ルートの指定
Pegasus は他の web サーバと異なり、実ホストや仮想ホストやユーザごとに、web のコンテンツはもちろん、コンテンツに対するアクセス制御ファイルや、CGI のための実行ファイルを持つことを許します。web にドキュメントを公開しているどのシステムユーザにも web ルート(root) が割り当てられ(以下このディレクトリを
$web で表す)、その下に doc、etc、bin を持つことができます。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/www と usr/carol/https を与えられたことになります。システムのユーザは(
alice も bob も carol も) /sys/lib/httpd.rewrite で特に設定しなくても $home/web/doc を持っていれば、自動的に $home/web が web ルートになり、$home/web/doc の下にあるドキュメントはクライアントからはhttp://pegasus.goodwill.com/~aliceでアクセスできるようになります。(この自動化は
httpd のオプションで取り消すこともできます。)
注意: 仮想ホストの名称は、DNS サーバに登録する必要があります。
2003/02/11 追加
- 仮想ホスト名の親ドメインがサーバの親ドメインと一致している場合には、親ドメイン部を省略できます。例えばサーバが
pegasus.goodwill.comで仮想ホストがcar.goodwill.comの場合には単にcarと書いてかまいません。
- 仮想ホスト名の親ドメインがサーバの親ドメインと異なる場合、例えばサーバが
pegasus.goodwill.comで仮想ホストがpegasus.goodwill.orgの場合にはpegasus.goodwill.orgに対してはフルネームを使用してください。
- 仮想ホストが独自の IP アドレスを持つ場合には、その IP アドレスもホスト名部に追加してください。(でないとクライアントは IP アドレスでアクセスできません)
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 を参照してください。)
個別の吟味
emily の www_removed
/~emily */usr/bob/www_removedさて、この
www_removed は emily が削除されたことを知らせる案内を置くディレクトリです。案内は/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 の形式
一般規則
#で始まる行はコメントである。
- コメント行以外は、どの行も2つのフィールドから構成される。
- フィールドは空白文字で区切られる
メタ記号
[ ]
省略可能である事を意味する
|
選択を表す
:=
左辺は右辺の記号あるいは名前で置き換えられる
- ::
左辺の説明が右辺で与えられる
第1フィールドの形式
第1フィールドは以下の2つのうちのいずれかです。1. scheme://host[:port] 2. /path
ここに
scheme := http | https
host ::ホスト名 | ホストの完全名 | IP
port ::ポート番号
path ::ドキュメントへのパス
schemeとhostは小文字で書いてください
portは80と443については省いてください
第2フィールドの形式
第2フィールドは以下の2つのうちのいずれかです。
1. scheme://hostdom[:port][/path][;params][?query] 2. */path
ここに
params := param[;params]
scheme ::任意のスキーム
hostdom ::ホストの完全名 (pegasus.goodwill.comなど)
port ::ポート番号
path ::ドキュメントへのパス
params ::CGI に渡す引数リスト
query :: query文字列