Logo address

HTTP/1.1

2002/03/24

Pegasus は Plan9 第3版の標準 Httpd をベースに開発されました。従って標準 httpd の HTTP/1.1 の仕様を継承しています。

URI redirection

サーバに対するクライアントからのリクエストは本質的にはファイルの要求です。
HTTP/1.1 のサーバは、クライアントからリクエストされたファイルに対して、他のファイルや URI をクライアントに紹介するメカニズムを持っている。

例えば URI

	http://plan9.aichi-u.ac.jp/pegasus
について考えてみましょう。この URI は正しくはありません。なぜなら pegasus はディレクトリ名であり、その場合には
	http://plan9.aichi-u.ac.jp/pegasus/
が正しい URI です。(が多くの人はスラッシュを付けないでしょう)

クライアントが pegasus をファイルであると誤解したままでいると、

	http://plan9.aichi-u.ac.jp/pegasus/index.html
に記述されているファイルやディレクトリのパスを誤解します。例えばこの中で <a href="man-1.0/"> と書かれていると、クライアントは man-1.0 への URI が
	http://plan9.aichi-u.ac.jp/man-1.0/
であると誤解するのです。(従ってアクセスに失敗するでしょう)

HTTP/1.1 はこの問題を URI redirection によって解決しています。即ちディレクトリ名に対してスラッシュで閉じないでリクエストされた場合にはサーバはスラッシュを付けて再度要求する様にクライアントに伝えます。クライアントは自動的に正しい URI を再送信します。

URI redirection に関する他の応用はホームページが移動した場合の処理です。自動的に新しいホームページにクライアントを誘導できます。(この設定は rewrite ファイルで行います。)

Pegasus は URI redirection を Pegasus 内部のレベル、管理者レベル、ユーザレベルでサポートしています。

仮想ホスト

仮想ホストは HTTP/1.1 でサポートされました。これによって1つのホストが1つのIPアドレスで複数のドメイン名を持つ事ができるようになりました。

ブラウザを使用してホスト ar.aichi-u.ac.jp にアクセスする場合、ブラウザの URI フィールドに

	http://ar.aichi-u.ac.jp
と書きます。するとブラウザはホスト ar.aichi-u.ac.jp のポート 80 に
	GET / HTTP/1.1
	User-Agent: ....
	Host: ar.aichi-u.ac.jp
	...</pre>
のようなメッセージを送ります。

ここに現れる Host が HTTP/1.1 で新たに登場したヘッダです。
ar.aichi-u.ac.jp の IP アドレスは 202.250.160.40 ですが、ネームサーバにはこの IP で複数の名前を登録できます。例えば
pegasus.aichi-u.ac.jp も登録して構いません。するとサーバは同一のポート 80 から異なる Host ヘッダを受け取ることになります。サーバは Host ヘッダを見て、異なる処理を行う事が可能になります。これが仮想ホストの仕組みです。

Pegasus は仮想ホストをサポートしています。しかも仮想ホスト毎に独立した名前空間を提供しています。

持続的接続(persistent connection)

HTTP/1.1 からは持続的接続が接続方式の基本となりました。持続的接続はサーバあるいはクライアントの一方が接続を閉じた時に終了します。

Pegasus は、通常のファイル転送に関しては持続的接続を続行します。しかし CGI については現在の所、持続的接続を解消しています。CGI に関しても持続的接続を行えるようにすべきですが、これは次の版で対応を予定しています。

持続的接続の問題は運用上難しいものがあります。サーバがおっとりしていると攻撃の対象になりかねません。(だから筆者は、用が済めばさっさと切りたい。) どのタイミングで切れば良いのか、判断に迷っています。さらに CGI で持続的接続を行う場合には、サーバは CGI の出力を全て一旦受け取る事になります。(なぜなら Content-Length をクライアントに伝えなくてはなりません。) この場合、CGI プログラムがバックグランドジョブを流した場合に、そのジョブが終るまでサーバは待たされる事になります。(Webメールの場合にそのような問題が発生する。)

かような訳で現在は思案中…

アクセスメソッド

Pegasus は
をサポートしています。
はサポートしていません。これらは簡単だから容易にサポートできるのですが、PUT と DELETE はブラウザが対応していません。(Netscape がかって対応していた事はありますが…) それに基本認証では PUT や DELETE は危なくてサポートの意欲が消えます。