<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="10" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[10]</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:">頭欄</anchor>のうち、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">鯖</anchor>によって解釈されるものが 
<dfn>CGI <rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">欄<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">-field</rt></rubyb></dfn>です。その欄は、たとえ同名の欄が HTTP 
などのプロトコルで規定されていたとしても、 CGI での仕様に従って解釈されます。</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="11" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[11]</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">http://tools.ietf.org/html/rfc3875#section-6</anchor-external></li></ul></refs></section><section><h1>構文</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> CGI <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">スクリプト</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:">SIP</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>部から成り、
両者は空行で区切られます。</p><p>しかし、非解析頭 (nph)
出力の場合を除いて、
これが直接<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><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="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:">NPHスクリプト</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:">HTTP</anchor> の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">頭欄</anchor>とみなされます。
詳しくは<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">NPH応答</anchor>の項を参照してください。</comment-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> 頭の部分は、やはり HTTP や SIP
同様に<dfn><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">頭欄</anchor></dfn>を並べるのですが、
この頭欄にはプロトコルの頭欄と
CGI の頭欄の2種類があります。
どちらも構文的には同じで、
欄の名前によってのみ区別できます。
(順番もごちゃ混ぜで構いません。)
<weak xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">(あ、でも、 SIP CGI の頭欄は名前が必ず <code xmlns="http://www.w3.org/1999/xhtml" class="CGI">CGI-</code> で始まるので分かります。)</weak></p><p>CGI の頭欄はサーバーでの処理に使われ、
直接は応答としてクライアントに送られません。
プロトコルの頭欄は <weak xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><anchor-internal a0:anchor="1" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;1</anchor-internal> で述べたように編集されることはあるものの</weak>そのまま応答に使われます。
これが最大の違いです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="3" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[3]</anchor-end> たとえば、 HTTP CGI
では <code class="CGI">Status:</code>
という欄があり、これを使って
HTTP の応答符号を指定できます。
しかし、この欄はサーバーでの処理が終わると捨てられ、
クライアントには送られません。</p><p><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> CGI 欄として定義されているもの以外は、
すべてプロトコルの頭欄として扱われます。</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> 詳しくは<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CGI応答</anchor>の項を参照してください。</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:">CGI欄</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="11" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;11</anchor-internal></src>
また、それぞれの種類に応じた制約があります。</p></section><section><h1>CGI 欄の一覧</h1><table><tbody><tr><td>1.1</td><td>SIP</td><td>欄名</td></tr><tr><td></td><td>○</td><td><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CGI-Remove:</anchor></td></tr><tr><td></td><td>○</td><td><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">CGI-Request-Token:</anchor></td></tr><tr><td>○</td><td></td><td><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Content-Type:</anchor></td></tr><tr><td>○</td><td></td><td><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Location:</anchor></td></tr><tr><td>○</td><td></td><td><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Status:</anchor></td></tr><tr><td></td><td></td><td><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Variable-*:</anchor></td><td>[FastCGI]</td></tr><tr><td></td><td></td><td><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">w3m-control:</anchor></td><td>[w3m]</td></tr><tr><td>○</td><td></td><td><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">X-CGI-*:</anchor></td></tr></tbody></table><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[6]</anchor-end> HTTP CGI の頭欄である
<code class="CGI">Content-Type:</code>
欄や <code class="CGI">Location:</code>
欄は、 HTTP 
でも同じ名前の欄が規定されていますが、
やや振る舞いが違うとか、
CGI における重要性とかから特別に扱われます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[7]</anchor-end> HTTP CGI の頭欄であっても SIP
CGI の頭欄ではないものは、
SIP の頭欄として扱われます。
(それに意味があるかどうかは SIP
の規定によります。) 逆も同様です。
頭欄の具体的なことについては HTTP
CGI と SIP CGI とでまったく互換性がないといってよいでしょう。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="5" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[5]</anchor-end>
CGI 頭は、本体と空行で区切られます。継続行は認められていません。
CGI 頭欄と HTTP 頭欄は混在 (順番が) していても構いませんが、
CGI 頭欄を極力先に出力することが推奨されています。</p><p>CGI 頭欄はそれぞれ1回だけ使えます。一つの CGI 頭には、
最低1つの CGI 頭欄が必要です。つまり、上記の内1つは必ず
出力されるということです。</p><p>本体を出力する時は、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Content-Type:領域</anchor> を出力し<em>なければなりません</em>。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Location:領域</anchor> を出力する時は、 HTTP 欄を出力し<em>てはいけません</em>。</p><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="8" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[8]</anchor-end> 欄名は大文字・小文字を区別しませんが、区別する DQN サーバーもあったみたいです: <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://homepage1.nifty.com/yito/namazu/gbook/19991022.1156.html">http://homepage1.nifty.com/yito/namazu/gbook/19991022.1156.html</anchor-external></li><li><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> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Apache</anchor> は、 <code class="CGI">Status</code> 欄は CGI でなくても、 <code><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">send-as-is</anchor></code> でも有効らしいです。 <code class="CGI">Content-Type</code> と <code class="CGI">Location</code> は区別がつかないので対応しているのかいないのかわかりませんが。。。 (<code>Location</code> は分かるか。)</li></ul></section><section><h1>拡張 CGI 欄</h1><p><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>で標準の3種類以外の <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>の名前は <dfn><code class="HTTP" xml:lang="en">X-CGI-</code></dfn> で始まる<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><strong xmlns="http://www.w3.org/1999/xhtml">べきです</strong></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="11" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;11</anchor-internal></src></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> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">実装</anchor>は、未対応の <code class="HTTP" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">X-CGI-*:</anchor></code> 欄を受け取った時、これを無視したり、
削除したりして<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><strong xmlns="http://www.w3.org/1999/xhtml">構いません</strong></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="11" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;11</anchor-internal></src></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></section></body></html>