[1] CGI のメタ変数 SERVER_PROTOCOL
は、
クライアントからの要求に使われた応用プロトコルの名前と版を表します。
SERVER_PROTOCOL = HTTP-Version | "INCLUDED" | extension-version HTTP-Version = "HTTP" "/" 1*digit "." 1*digit extension-version = protocol [ "/" 1*digit "." 1*digit ] protocol = token
[13] 鯖は、クライアントからの要求において使われた応用プロトコルの名前と版を
SERVER_PROTOCOL
に設定しなければなりません。なお、
これは鯖がクライアントとやり取りするのに使うプロトコルの版と違っていることもあります。
>>10
[14] 例えばクライアントが HTTP/1.1 で要求し、鯖がそれに
HTTP/1.0 で応答することがあり、その場合 SERVER_PROTOCOL
は HTTP/1.1
となると思われます。
[5] この変数の値は大文字・小文字を区別しませんが、
伝統的に protocol
は大文字にすることになっています。
CGI script の実装は大文字・小文字の違いを吸収するようになっていないことがほとんどであると予想されますから、 サーバーは「よく知られた」 表記とは違ったものを与えるべきではないでしょう。
[3] protocol
の値は、 URI の scheme
と一致するとは限りません。
たとえば、 https:
URI が使われたとしても、
プロトコルは HTTP over SSL で、実際に関係するのは
HTTP だけなので、
HTTP
という値が入ります。
[4] 値の一覧は、 protocol
を参照してください。
[8] Apache では Action
を使った関連付けみたいな機能がありますが、この機能を使って間接的に呼び出されることとなった CGI でも、普通に呼び出された場合と同じ結果 (HTTP/?.?
) が得られるようです。
[9] w3m の LocalCGI では HTTP/1.0
になります。
[28] HTTP/0.9 や HTTP/2 の際にどの値となるべきなのかは不明です。
[31]
Web Transport Processing は HTTP/2.0
という値を採用しています >>30。
この値は接続序文で使われているもので、従来のプロトコルの版の構文を期待する古い実装を惑わせることが無いと期待されるものです。
[29] P6W は HTTP/2 で HTTP/2
、 WebSocket で WebSocket/13
という値を使っています。
INCLUDED
[11] CGIスクリプトがクライアントの要求に直接的に呼び出されたのではなく、
他の文書の一部として取り込まれるために呼び出された場合、 SERVER_PROTOCOL
として INCLUDED
という値を使うことができます >>10。
[18] 具体的には Apache で SSI を使うと INCLUDED
という値が設定されます。
[7] >>4 echo
擬似要素を使う方法と include
擬似要素を使う方法の2種類が SSI にはありますが、 Apache ではどちらでも INCLUDED
になりました。
[2] [NCSA] では形式は単に 「protocol/revision」としか述べられていませんが、 [COAR 03] で明確化されています。
[16] CGI のプロトコル依存の機能に関して、どのプロトコルであるかは
SERVER_PROTOCOL
によって表されます。例えば SERVER_PROTOCOL
のプロトコル名が HTTP
の時、 HTTP のプロトコル依存の機能である
HTTP_*
メタ変数を使うことができます。
SERVER_PROTOCOL
だけで決まるわけではありません。トランスポート層に TLS を使っている場合
SSL_*
メタ変数が利用可能になりますが、それは
SERVER_PROTOCOL
には表れません。[23] 鯖は HTTP/1.1 の PUT
や DELETE
を実装する場合、 SERVER_PROTOCOL
をチェックするべきとされています。 >>22
protocol
も参照してください。