Kenji Arisawa E-mail: arisawa@aichi-u.ac.jp Aichi University Kurozasa 370, Miyoshi-cho Aichi, Japan 2002/03/24Powered by Pegasus
HTTP/1.1
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 ...のようなメッセージを送ります。
ここに現れる 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 は- GET
- HEAD
- POST
- OPTIONS
- PUT
- DELETE
- TRACE