/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である。
alicepegasus に自分のページを持ちたいと考えている。すなわち次の URI を持ちたいと考えている。bobhttp://pegasus.goodwill.com/private へのアクセスは、http ではなく、https を使用すべきであると考えている。carolcar.goodwill.com を持ち、販売に役立てたいと考えている。http と https の両プロトコルを利用し、クライアントからはhttps によるアクセスは、セキュリティ上の理由により、http でサービスするディレクトリとは独立したディレクトリで処理を行いたいと考えている。davidhttp://www.eecs.harvard.edu/~david に彼のホームページを持っている。bob は彼のドキュメントにアクセスするクライアントに対して、david の新しい URI にアクセスされるようにしたいと考えている。emilybob は彼女へのアクセスがあった場合にはクライアントに対して、このユーザが削除されたことを伝えたいと考えている。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 | httpshost :: ホスト名 | ホストの完全名 | 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 文字列