/sys/lib/httpd.rewrite
emily
の www_removed
/usr/bob/www/etc/rewrite
/sys/lib/httpd.rewrite
の形式
2003/02/11 改訂
/sys/lib/httpd.rewrite
pegasus.goodwill.comとします。ここに登場するのは5人のシステムユーザの名前で、それらは
alice bob carol david emilyである。
alice
pegasus
に自分のページを持ちたいと考えている。すなわち次の URI を持ちたいと考えている。bob
http://pegasus.goodwill.com/private
へのアクセスは、http
ではなく、https
を使用すべきであると考えている。carol
car.goodwill.com
を持ち、販売に役立てたいと考えている。http
と https
の両プロトコルを利用し、クライアントからはhttps
によるアクセスは、セキュリティ上の理由により、http
でサービスするディレクトリとは独立したディレクトリで処理を行いたいと考えている。david
http://www.eecs.harvard.edu/~david
に彼のホームページを持っている。bob
は彼のドキュメントにアクセスするクライアントに対して、david
の新しい URI にアクセスされるようにしたいと考えている。emily
bob
は彼女へのアクセスがあった場合にはクライアントに対して、このユーザが削除されたことを伝えたいと考えている。scheme://host[:port][/path][;params][?query]ここに
[ ]
はメタ記号で省略可能であることを表しますscheme
は HTTP の場合には http
ですが、暗号プロトコル SSL が使用されている場合には https
となりますparams
を CGI の引数、query
を CGI に渡す環境変数として扱っています。この扱いはサーバに依存しています。params
や query
の形式はここでは問題にする必要はありません。(空白文字を含まない事だけを知っていればよいでしょう)host
は、クライアントがこの IP アドレスを知っていることが必要であり、通常は DNS サーバに登録してしておきますport
が省略されると http
の場合には 80、https
の場合には 443 が仮定されますpath
はサーバのドキュメントルートからのファイルの相対パスです~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つのフィールドから構成されます。(フィールドは空白文字で区切られています)scheme
は http
と https
だけです。また host
は、実ホストまたは仮想ホストの名前です。(完全名ではないことに注意します。)
/
で始まる場合には実ホストと実ホストのユーザに対する要求であるとみなします。すなわち、scheme://host[:port]
が省略されているとみなします。ここに host
は実ホストの名前である。
第2フィールドは、
*
で始まる場合には、web ルートが指定されていますscheme
で始まる場合には、この URI にクライアントを誘導します/
で始まる場合のサポートは次回に回します。現在はこの場合には、第1フィールドと同一の scheme://host[:port]
が省略されたと見なされます(第1フィールドが /
で始まる場合には、第1フィールドにマッチすることによって受け入れられた scheme://host[:port]
が省略されたと見なされます)。しかしこれを仕様として固定するまえに、ニーズについて検討を加えたいと思います。
要求された URI が第1フィールドにマッチした場合、第2フィールドが *
で始まるか否かによって処理が異なります。
*
で始まる場合には、リクエストは第2フィールドで指定された名前空間に渡されます。*
で始まらない場合には、マッチした残りの部分が第2フィールドに追加され、その結果が(リダイレクションループにならない場合には)クライアントに通知されます。http
や https
で始まる行は仮想ホストと実ホストの変換規則である/~
で始まる行は実ホストのユーザの変換規則である/
で始まり、/~
では始まらない行は実ホストの変換規則であるscheme
で始まる行について行われ、マッチしない場合にはさらに /
で始まる行に対して行われる/path
が /~
で始まる場合には /
にマッチするとはみなさない/
だけの行は最後に置きます。これは必須です。
/sys/lib/httpd.rewrite
の中にマッチするものがなければ実ホストのユーザに対するリクエストである可能性が調べられます。
$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
のオプションで取り消すこともできます。)
2003/02/11 追加
pegasus.goodwill.com
で仮想ホストが car.goodwill.com
の場合には単に car
と書いてかまいません。pegasus.goodwill.com
で仮想ホストが pegasus.goodwill.org
の場合には pegasus.goodwill.org
に対してはフルネームを使用してください。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
の形式#
で始まる行はコメントである。[ ]
|
:=
1. scheme://host[:port] 2. /path
ここに
scheme := http | https
host ::
ホスト名 | ホストの完全名 | IPport ::
ポート番号path ::
ドキュメントへのパスscheme
と host
は小文字で書いてくださいport
は 80
と 443
については省いてください
1. scheme://hostdom[:port][/path][;params][?query] 2. */path
ここに
params := param[;params]
scheme ::
任意のスキームhostdom ::
ホストの完全名 (pegasus.goodwill.com
など)port ::
ポート番号path ::
ドキュメントへのパスparams ::
CGI に渡す引数リストquery :: query
文字列