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
文字列