* 仕様書 [REFS[ - [5] [CITE@en[RFC 3875 - The Common Gateway Interface (CGI) Version 1.1]] -- [2] -- [6] '''''' ]REFS] * 構文 [11] [[CGI応答]]は、 - 1つ以上の[[頭欄]] - [CODE(ABNF)[[[NL]]]] - [[応答本体]] (省略可能) ... の3つの部分により構成されます。あるいは [[CGI応答]]は次の3種類に分類できます。 [RC[>>6]] - [[文書応答]] - [[局所リダイレクト応答]] - [[クライアント・リダイレクト応答]] * 文書応答 [12] [DFN[[RUBYB[文書応答]@en[document response]]]]は、[[クライアント]]に対して[[文書]]を返すものです。 [SRC[>>6]] - [13] [CODE(HTTP)@en[[[Content-Type:]]]] 欄は[['''必須''']]です - [14] [CODE(HTTP)@en[[[Status:]]]] 欄を指定することができます - [15] その他の[[頭欄]]を指定することができます - [16] [[応答本体]]を指定することができます [17] [[鯖]]は[[CGI応答]]を適宜変形して[[クライアント]]との[[プロトコル]]に適合するようにしなければ[['''なりません''']]。 [SRC[>>6]] ;; [18] そうできないときにどうしなければならないかは明記されていません。通常は適合といっても完璧に適合するかどうか[[鯖]]が検査するのではなく、 実用上十分な程度の要件を満たすよう整形や[[転送符号化]]等を適用するくらいです。 * 局所リダイレクト応答 [19] [DFN[[RUBYB[局所リダイレクト応答]@en[local redirect response]]]]は、[[CGIスクリプト]]が指定した [[path]] に対するアクセスであったものとして再度[[鯖]]によって処理しなおすことを指示するものです。 [SRC[>>6]] - [20] [CODE(HTTP)@en[[[Location:]]]] 欄は必須であり、 [[path]] からはじまる構文でなければなりません - [21] それ以外の[[頭欄]]や[[応答本体]]を指定しては[['''なりません''']] [22] [[鯖]]は [PRE[ scheme "://" server-name ":" server-port local-pathquery ]PRE] ... という [[URL]] ([CODE[local-pathquery]] が [CODE(HTTP)@en[[[Location:]]]] 欄で指定された値) に[[要求]]があったものとして処理しなおさなければ[['''なりません''']]。 [SRC[>>6]] ;; [23] [[リダイレクト・ループ]]に対する処理をどうするべきか明確にされていません。 ;; [24] >>21 が守られていない場合にどうなるのかも明確にされていません。 * クライアント・リダイレクト応答 [25] [DFN[[RUBYB[クライアント・リダイレクト応答]@en[client redirect response]]]]は[[クライアント]]に対して[[リダイレクト]]を指示するものです。[[文書]]付きと[[文書]]無しの2種類があります。 それぞれの要件は次の通りです [SRC[>>6]]。 - [26] [CODE(HTTP)@en[[[Location:]]]] 欄は必須であり、[[絶対URL]]でなければなりません - [27] 文書無しの場合、 -- [28] [CODE(HTTP)@en[[[Status]]]], [CODE(HTTP)@en[[[Content-Type]]]], [CODE(HTTP)@en[[[Location]]]] ''以外''の[[CGI頭欄]]を使って構いません -- [30] [[CGI頭欄]]以外の[[頭欄]]を使ってはなりません -- [29] [[応答本体]]を使ってはなりません - [31] 文書付きの場合 -- [32] [CODE(HTTP)@en[[[Status]]]], [CODE(HTTP)@en[[[Content-Type]]]], [CODE(HTTP)@en[[[Location]]]] のすべてを指定しなければなりません -- [36] [CODE(HTTP)@en[[[Status]]]] は[[クライアント]]による[[リダイレクト]]を指示するものでなければ[['''なりません''']] -- [33] 他の[[頭欄]]を指定して構いません -- [34] [[応答本体]]を使って構いません [35] [[鯖]]は文書無しの場合 [CODE(HTTP)@en[[[302]]]] [[応答]]を返さなければ[['''なりません''']]。 [SRC[>>6]] [303] [[鯖]]は文書付きの場合[[CGI応答]]を適宜変形して[[クライアント]]との[[プロトコル]]に適合するようにしなければ[['''なりません''']]。 [SRC[>>6]] * 処理モデル [7] [[CGIスクリプト]]は常に空でない[[応答]]を[[鯖]]に送り返さなければ[['''なりません''']]。 [SRC[>>6]] [8] [[CGIスクリプト]]から[[鯖]]にデータを送る方法は[[システム定義]]です。 別途定義がない場合、「[[標準出力]]」[[ファイル記述子]]によってデータを送ることになります。 [SRC[>>6]] [9] [[CGIスクリプト]]は[[応答]]を準備するに当たり [CODE(CGI)@en[[[REQUEST_METHOD]]]] をチェックしなければ[['''なりません''']]。 [SRC[>>6]] [10] [[鯖]]は[[タイムアウト]]を設定して[['''構いません''']]。その場合、[[タイムアウト]]になると[[スクリプト]]を終了させて[['''構いません''']]。 [SRC[>>6]] * [CODE(CGI)@en[HEAD]] の場合 [1] [CODE(CGI)@en[[[HEAD]]]] [[メソッド]]の場合、 [[CGIスクリプト]]は[[応答本体]]を指定しては[['''なりません''']]。 [[鯖]]は指定されても捨てなければ[['''なりません''']]。 [SRC[>>2]] ;; [3] 多くの[[CGIスクリプト]]は [CODE(CGI)@en[[[HEAD]]]] [[メソッド]]に対応しておらず、 [CODE(CGI)@en[[[GET]]]] と同じものを返し、結果として >>1 の要件に違反しています。 * NPH スクリプトの場合 [4] [[NPHスクリプト]]は完全な [[HTTP]] [[応答メッセージ]]を返すことが求められています。 詳しくは[[NPH応答]]の項を参照してください。