SERVER_PROTOCOL

メタ変数 SERVER_PROTOCOL (CGI)

[1] CGIメタ変数 SERVER_PROTOCOL は、 クライアントからの要求に使われた応用プロトコルの名前と版を表します。

仕様書

[12] 値の構文は次のように定義されています >>10

      SERVER_PROTOCOL   = HTTP-Version | "INCLUDED" | extension-version
      HTTP-Version      = "HTTP" "/" 1*digit "." 1*digit
      extension-version = protocol [ "/" 1*digit "." 1*digit ]
      protocol          = token

[26] protocol も参照してください。

[13] は、クライアントからの要求において使われた応用プロトコルの名前と版を SERVER_PROTOCOL に設定しなければなりません。なお、 これはクライアントとやり取りするのに使うプロトコルの版と違っていることもあります。 >>10

[14] 例えばクライアントHTTP/1.1要求し、がそれに HTTP/1.0応答することがあり、その場合 SERVER_PROTOCOLHTTP/1.1 となると思われます。

[15] 本当にそれが有用なのかはわかりませんが・・・。

[5] この変数の値は大文字・小文字を区別しませんが、 伝統的に protocol は大文字にすることになっています。

CGI script の実装は大文字・小文字の違いを吸収するようになっていないことがほとんどであると予想されますから、 サーバーは「よく知られた」 表記とは違ったものを与えるべきではないでしょう。

[3] protocol の値は、 URI の scheme と一致するとは限りません。 たとえば、 https: URI が使われたとしても、 プロトコルは HTTP over SSL で、実際に関係するのは HTTP だけなので、 HTTP という値が入ります。

プロトコル名の一覧

[4] 値の一覧は、 protocol を参照してください。

[8] Apache では Action を使った関連付けみたいな機能がありますが、この機能を使って間接的に呼び出されることとなった CGI でも、普通に呼び出された場合と同じ結果 (HTTP/?.?) が得られるようです。

[9] w3mLocalCGI では HTTP/1.0 になります。

[28] HTTP/0.9HTTP/2 の際にどの値となるべきなのかは不明です。

[31] Web Transport ProcessingHTTP/2.0 という値を採用しています >>30。 この値は接続序文で使われているもので、従来のプロトコルの版の構文を期待する古い実装を惑わせることが無いと期待されるものです。

[29] P6WHTTP/2HTTP/2WebSocketWebSocket/13 という値を使っています。

INCLUDED

[11] CGIスクリプトクライアント要求に直接的に呼び出されたのではなく、 他の文書の一部として取り込まれるために呼び出された場合、 SERVER_PROTOCOL として INCLUDED という値を使うことができます >>10

[18] 具体的には ApacheSSI を使うと INCLUDED という値が設定されます。

[7] >>4 echo 擬似要素を使う方法と include 擬似要素を使う方法の2種類が SSI にはありますが、 Apache ではどちらでも INCLUDED になりました。

[19] CGIスクリプトINCLUDEDHTTP/1.0 として扱うべきです。 >>10

[20] ということは HTTPプロトコル依存の機能 (HTTP_* など) が利用可能であると期待して良いのでしょうか。

歴史

[2] [NCSA] では形式は単に 「protocol/revision」としか述べられていませんが、 [COAR 03] で明確化されています。

protocol であって token でないのは、 URIscheme 名との互換性を考慮したのでしょう。

関連

[16] CGIプロトコル依存の機能に関して、どのプロトコルであるかは SERVER_PROTOCOL によって表されます。例えば SERVER_PROTOCOLプロトコル名が HTTP の時、 HTTPプロトコル依存の機能である HTTP_* メタ変数を使うことができます。

[17] しかしプロトコル依存の機能の有無が SERVER_PROTOCOL だけで決まるわけではありません。トランスポート層TLS を使っている場合 SSL_* メタ変数が利用可能になりますが、それは SERVER_PROTOCOL には表れません。

[23] HTTP/1.1PUTDELETE を実装する場合、 SERVER_PROTOCOL をチェックするべきとされています。 >>22

[24] 実際にはこれらのメソッドを使えるかどうかと HTTP の版は関係ないので、 あまり意味のない要件な気がします。