status

Status: ヘッダー (HTTP)

[11] CGI応答で使われるCGI欄 Status: は、 応答状態符号を指定します。

仕様書

構文

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

      Status         = "Status:" status-code SP reason-phrase NL
      status-code    = "200" | "302" | "400" | "501" | extension-code
      extension-code = 3digit
      reason-phrase  = *TEXT

[13] なぜ4つだけあえて定義されているのはよくわかりませんが・・・。

[14] この欄には HTTP 状態符号と、それに併記する事由を指定します。

[15] プロトコル非依存を装ってる CGIRFC ですが、ここだけはなぜかというか流石にというか、 HTTP のことしか書いてなくて他のプロトコルの存在を完全に無視していますww

[16] Status: 欄は局所リダイレクト応答では使えませんが、それ以外のCGI応答で使うことができます。

[17] この欄の値が不適切なときのの処理は明記されていません。

[18] この欄の値は必ずしもスクリプト誤りの状況でなくても構いません。例えば、誤りの処理のために CGIスクリプトが呼ばれている場合、その誤りの状況を説明する状態符号を使うべきです。 >>10

歴史

CGI/1.1 (coar draft 03)

[9] 7.2.1.3. Status

The "Status" header field is used to indicate to the server what status code the server MUST use in the response message.

"Status" 頭欄はサーバーがどの状態符号を応答メッセージに使わなければならない かをサーバーに示すのに使います。

    Status        = "Status" ":" digit digit digit SP reason-phrase NL
    reason-phrase = *<CHAR, excluding CTLs, NL>
   The valid status codes are listed in section 6.1.1 of the
   HTTP/1.0 specifications [3]. If the SERVER_PROTOCOL is
   "HTTP/1.1", then the status codes defined in the HTTP/1.1
   specification [8] may be used. If the script does not return a
   "Status" header field, then "200 OK" SHOULD be assumed by the
   server.

妥当な状態符号は HTTP/1.0 仕様書の 6.1.1節に列挙されています。 SERVER_PROTOCOL が "HTTP/1.1" の場合、状態符号は HTTP/1.1 で定義されているものを使って構いません。 Script が "Status" 頭欄を返さない場合は、 "200 OK" がサーバーにより 仮定されるべきです

   If a script is being used to handle a particular error or
   condition encountered by the server, such as a '404 Not Found'
   error, the script SHOULD use the "Status" CGI header field to
   propagate the error condition back to the client. E.g., in the
   example mentioned it SHOULD include a "Status: 404 Not Found"
   in the header data returned to the server.

Script がサーバーの遭遇した特定の誤り又は状態, 例えば「404 Not Found」誤りを取り扱うのに使われる場合、 script は顧客に誤り状態を伝えるために "Status" CGI 頭欄を使うべきです。 例えばこの例では、サーバーに返される頭データに "Status: 404 Not Found" を含めるべきです

BNF

  1. Status = "Status:" [WSP] Status-Code SP Reason-Phrase
  2. Status-Code = 3DIGIT
  3. Reason-Phrase = cgi-rtext / http-rtext
  4. cgi-rtext = %x20-7E
  5. http-rtext = %x09 / %x20-7E / %x80-FF

HTTP応答の staus-line では Reason-Phrase は OCTET - CTL + LWS - CR - LF で定義されているのですが、 CGI/1.1 では CHAR - CTL ですから、 CGI の方が使える文字が少ないことになります。

参考までに、

  1. sip-rtext = %x09 / %x20-7E / UTF8-xtra

です。が、 SIP-CGI に Status: 欄はありません。

SPDY

[1] SPDY では status ヘッダー状態符号を表すために使われていました。

[2] HTTP/2 では :status 疑似ヘッダーになりました。

実装

[19] 元々 CGI で実装されていて、その後それ以外の API に移行した Webアプリケーションで、 あるいはその他の理由で正常に動作していないWebアプリケーションで、 Status: 欄が処理されずにHTTP 応答に含まれることもあります。

[20] ApacheCGI だけでなく、 send-as-is でも Status: 欄を解釈するようです。

as-is じゃないですね・・・。

[21] RFC 4975 - The Message Session Relay Protocol (MSRP) ( ( 版)) <http://tools.ietf.org/html/rfc4975#page-37>

[4] 「いま」を見つけよう () <https://twitter.com/>

status: 200 OK