#?SuikaWiki/0.9 [1] CGI [[スクリプト]]の出力は [[HTTP]] や [[SIP]] の[[メッセージ]]の出力同様に[[頭部]]と[[本体]]部から成り、 両者は空行で区切られます。 しかし、非解析頭 (nph) 出力の場合を除いて、 これが直接[[応答]]として使われるわけではありません。 [[サーバー]]がそれをみて欄を補ったり値を適切に修正したりして応答となります。 [2] 頭の部分は、やはり HTTP や SIP 同様に[DFN[[[頭欄]]]]を並べるのですが、 この頭欄にはプロトコルの頭欄と CGI の頭欄の2種類があります。 どちらも構文的には同じで、 欄の名前によってのみ区別できます。 (順番もごちゃ混ぜで構いません。) [WEAK[(あ、でも、 SIP CGI の頭欄は名前が必ず [CODE(CGI)[CGI-]] で始まるので分かります。)]] CGI の頭欄はサーバーでの処理に使われ、 直接は応答としてクライアントに送られません。 プロトコルの頭欄は [WEAK[>>1 で述べたように編集されることはあるものの]]そのまま応答に使われます。 これが最大の違いです。 [3] たとえば、 HTTP CGI では [CODE(CGI)[Status:]] という欄があり、これを使って HTTP の応答符号を指定できます。 しかし、この欄はサーバーでの処理が終わると捨てられ、 クライアントには送られません。 [4] CGI 欄として定義されているもの以外は、 すべてプロトコルの頭欄として扱われます。 ,1.1,SIP,欄名 , ,○,[[CGI-Remove:]] , ,○,[[CGI-Request-Token:]] ,○, ,[[Content-Type:]] ,○, ,[[Location:]] ,○, ,[[Status:]] , , ,[[Variable-*:]] ,[FastCGI] , , ,[[w3m-control:]] ,[w3m] ,○, ,[[X-CGI-*:]] [6] HTTP CGI の頭欄である [CODE(CGI)[Content-Type:]] 欄や [CODE(CGI)[Location:]] 欄は、 HTTP でも同じ名前の欄が規定されていますが、 やや振る舞いが違うとか、 CGI における重要性とかから特別に扱われます。 [7] HTTP CGI の頭欄であっても SIP CGI の頭欄ではないものは、 SIP の頭欄として扱われます。 (それに意味があるかどうかは SIP の規定によります。) 逆も同様です。 頭欄の具体的なことについては HTTP CGI と SIP CGI とでまったく互換性がないといってよいでしょう。 [[#comment]] [5] CGI 頭は、本体と空行で区切られます。継続行は認められていません。 CGI 頭欄と HTTP 頭欄は混在 (順番が) していても構いませんが、 CGI 頭欄を極力先に出力することが推奨されています。 CGI 頭欄はそれぞれ1回だけ使えます。一つの CGI 頭には、 最低1つの CGI 頭欄が必要です。つまり、上記の内1つは必ず 出力されるということです。 本体を出力する時は、[[Content-Type:領域]] を出力し''なければなりません''。 [[Location:領域]] を出力する時は、 HTTP 欄を出力し''てはいけません''。 - [8] 欄名は大文字・小文字を区別しませんが、区別する DQN サーバーもあったみたいです: - [9] [[Apache]] は、 [CODE(CGI)[Status]] 欄は CGI でなくても、 [CODE[[[send-as-is]]]] でも有効らしいです。 [CODE(CGI)[Content-Type]] と [CODE(CGI)[Location]] は区別がつかないので対応しているのかいないのかわかりませんが。。。 ([CODE[Location]] は分かるか。)