<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="11" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[11]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CGI応答</anchor>で使われる<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CGI欄</anchor> <dfn><code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Status:</anchor></code></dfn> は、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応答</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態符号</anchor>を指定します。</p><section><h1>仕様書</h1><refs xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><ul xmlns="http://www.w3.org/1999/xhtml"><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="10" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[10]</anchor-end> <cite xml:lang="en">RFC 3875 - The Common Gateway Interface (CGI) Version 1.1</cite> (<time>2011-11-20 06:09:05 +09:00</time> 版) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://tools.ietf.org/html/rfc3875#section-6.3.3">http://tools.ietf.org/html/rfc3875#section-6.3.3</anchor-external></li></ul></refs></section><section><h1>構文</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="12" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[12]</anchor-end> この<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">欄</anchor>の値の構文は次のように定義されています <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="10" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;10</anchor-internal></src>。<pre class="ABNF code">      Status         = &quot;Status:&quot; status-code SP reason-phrase NL
      status-code    = &quot;200&quot; | &quot;302&quot; | &quot;400&quot; | &quot;501&quot; | extension-code
      extension-code = 3digit
      reason-phrase  = *TEXT</pre></p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="13" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[13]</anchor-end> なぜ4つだけあえて定義されているのはよくわかりませんが・・・。</comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="14" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[14]</anchor-end> この欄には <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP</anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態符号</anchor>と、それに併記する事由を指定します。</p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="15" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[15]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プロトコル</anchor>非依存を装ってる <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CGI</anchor> の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">RFC</anchor> ですが、ここだけはなぜかというか流石にというか、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP</anchor> のことしか書いてなくて他の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プロトコル</anchor>の存在を完全に無視していますww</comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="16" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[16]</anchor-end> <code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Status:</anchor></code> 欄は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">局所リダイレクト応答</anchor>では使えませんが、それ以外の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CGI応答</anchor>で使うことができます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="17" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[17]</anchor-end> この欄の値が不適切なときの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">鯖</anchor>の処理は明記されていません。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="18" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[18]</anchor-end> この欄の値は必ずしも<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">スクリプト</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">誤り</anchor>の状況でなくても構いません。例えば、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">鯖</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">誤り</anchor>の処理のために
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CGIスクリプト</anchor>が呼ばれている場合、その<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">鯖</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">誤り</anchor>の状況を説明する<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態符号</anchor>を使うべきです。 <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="10" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;10</anchor-internal></src></p></section><section><h1>歴史</h1><section><h1>CGI/1.1 (coar draft 03)</h1><figure class="quote"><figcaption><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="9" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[9]</anchor-end> 7.2.1.3. Status</figcaption><blockquote><p>The &quot;Status&quot; header field is used to indicate to the server
what status code the server MUST use in the response message.</p></blockquote><p>&quot;Status&quot; 頭欄はサーバーがどの状態符号を応答メッセージに使わ<strong>なければならない</strong>
かをサーバーに示すのに使います。</p><pre>    Status        = &quot;Status&quot; &quot;:&quot; digit digit digit SP reason-phrase NL
    reason-phrase = *&lt;CHAR, excluding CTLs, NL&gt;</pre><pre>   The valid status codes are listed in section 6.1.1 of the
   HTTP/1.0 specifications [3]. If the SERVER_PROTOCOL is
   &quot;HTTP/1.1&quot;, then the status codes defined in the HTTP/1.1
   specification [8] may be used. If the script does not return a
   &quot;Status&quot; header field, then &quot;200 OK&quot; SHOULD be assumed by the
   server.</pre><p>妥当な状態符号は HTTP/1.0 仕様書の 6.1.1節に列挙されています。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SERVER_PROTOCOL</anchor> が &quot;HTTP/1.1&quot; の場合、状態符号は
HTTP/1.1 で定義されているものを使って構いません。 Script
が &quot;Status&quot; 頭欄を返さない場合は、 &quot;200 OK&quot; がサーバーにより
仮定される<strong>べきです</strong>。</p><pre>   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 &quot;Status&quot; CGI header field to
   propagate the error condition back to the client. E.g., in the
   example mentioned it SHOULD include a &quot;Status: 404 Not Found&quot;
   in the header data returned to the server.</pre><p>Script がサーバーの遭遇した特定の誤り又は状態,
例えば「404 Not Found」誤りを取り扱うのに使われる場合、
script は顧客に誤り状態を伝えるために &quot;Status&quot; CGI 頭欄を使う<strong>べきです</strong>。
例えばこの例では、サーバーに返される頭データに &quot;Status: 404 Not Found&quot;
を含める<strong>べきです</strong>。</p></figure></section><section><h1>BNF</h1><ol><li>Status = &quot;Status:&quot; [WSP] Status-Code SP Reason-Phrase</li><li>Status-Code = 3DIGIT</li><li>Reason-Phrase = cgi-rtext / http-rtext</li><li>cgi-rtext = %x20-7E</li><li>http-rtext = %x09 / %x20-7E / %x80-FF</li></ol><p><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP応答</anchor>の staus-line では Reason-Phrase は OCTET - CTL + LWS - CR - LF
で定義されているのですが、 CGI/1.1 では CHAR - CTL ですから、
CGI の方が使える文字が少ないことになります。</p><p>参考までに、</p><ol><li>sip-rtext = %x09 / %x20-7E / UTF8-xtra</li></ol><p>です。が、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SIP-CGI</anchor> に Status: 欄はありません。</p></section><section><h1>SPDY</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">SPDY</anchor> では <code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">status</anchor></code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ヘッダー</anchor>が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">状態符号</anchor>を表すために使われていました。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[2]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP/2</anchor> では <code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">:status</anchor></code> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">疑似ヘッダー</anchor>になりました。</p></section></section><section><h1>実装</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="19" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[19]</anchor-end> 元々 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CGI</anchor> で実装されていて、その後それ以外の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">API</anchor> に移行した <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Webアプリケーション</anchor>で、
あるいはその他の理由で正常に動作していない<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Webアプリケーション</anchor>で、
<code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Status:</anchor></code> 欄が処理されずに<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTTP</anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">応答</anchor>に含まれることもあります。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="20" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[20]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Apache</anchor> は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CGI</anchor> だけでなく、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">send-as-is</anchor> でも <code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Status:</anchor></code>
欄を解釈するようです。</p><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:">as-is じゃないですね・・・。</comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="21" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[21]</anchor-end> <cite xml:lang="en">RFC 4975 - The Message Session Relay Protocol (MSRP)</cite>
( (<time>2012-02-26 13:20:50 +09:00</time> 版))
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://tools.ietf.org/html/rfc4975#page-37">http://tools.ietf.org/html/rfc4975#page-37</anchor-external></p><figure class="quote"><figcaption><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="4" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[4]</anchor-end> <cite xml:lang="ja">「いま」を見つけよう</cite>
(<time>2018-04-14 20:05:25 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://twitter.com/">https://twitter.com/</anchor-external></figcaption><blockquote><p>status: 200 OK</p></blockquote></figure></section></body></html>