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