/
237.txt
106 lines (82 loc) · 5.04 KB
/
237.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
[10] [[CGIスクリプト]]が出力する[[頭欄]]のうち、[[鯖]]によって解釈されるものが
[DFN[CGI [RUBYB[欄]@en[-field]]]]です。その欄は、たとえ同名の欄が HTTP
などのプロトコルで規定されていたとしても、 CGI での仕様に従って解釈されます。
* 仕様書
[REFS[
- [11] [CITE@en[RFC 3875 - The Common Gateway Interface (CGI) Version 1.1]] ([TIME[2011-11-20 06:09:05 +09:00]] 版) <http://tools.ietf.org/html/rfc3875#section-6>
]REFS]
* 構文
[1] CGI [[スクリプト]]の出力は
[[HTTP]] や [[SIP]]
の[[メッセージ]]の出力同様に[[頭部]]と[[本体]]部から成り、
両者は空行で区切られます。
しかし、非解析頭 (nph)
出力の場合を除いて、
これが直接[[応答]]として使われるわけではありません。
[[サーバー]]がそれをみて欄を補ったり値を適切に修正したりして応答となります。
;; [12] [[NPHスクリプト]]では[[CGI欄]]ではなく、すべて [[HTTP]] の[[頭欄]]とみなされます。
詳しくは[[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 欄として定義されているもの以外は、
すべてプロトコルの頭欄として扱われます。
;; [13] 詳しくは[[CGI応答]]の項を参照してください。
[14] [[CGI欄]]は、[[応答]]の中にそれぞれ一度だけ使うことができます。 [SRC[>>11]]
また、それぞれの種類に応じた制約があります。
* 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 とでまったく互換性がないといってよいでしょう。
[5]
CGI 頭は、本体と空行で区切られます。継続行は認められていません。
CGI 頭欄と HTTP 頭欄は混在 (順番が) していても構いませんが、
CGI 頭欄を極力先に出力することが推奨されています。
CGI 頭欄はそれぞれ1回だけ使えます。一つの CGI 頭には、
最低1つの CGI 頭欄が必要です。つまり、上記の内1つは必ず
出力されるということです。
本体を出力する時は、[[Content-Type:領域]] を出力し''なければなりません''。
[[Location:領域]] を出力する時は、 HTTP 欄を出力し''てはいけません''。
- [8] 欄名は大文字・小文字を区別しませんが、区別する DQN サーバーもあったみたいです: <http://homepage1.nifty.com/yito/namazu/gbook/19991022.1156.html>
- [9] [[Apache]] は、 [CODE(CGI)[Status]] 欄は CGI でなくても、 [CODE[[[send-as-is]]]] でも有効らしいです。 [CODE(CGI)[Content-Type]] と [CODE(CGI)[Location]] は区別がつかないので対応しているのかいないのかわかりませんが。。。 ([CODE[Location]] は分かるか。)
* 拡張 CGI 欄
[15] [[実装定義]]で標準の3種類以外の [[CGI欄]]に対応しても構いません。
その場合、[[頭欄]]の名前は [DFN[[CODE(HTTP)@en[X-CGI-]]]] で始まる[['''べきです''']]。 [SRC[>>11]]
[16] [[実装]]は、未対応の [CODE(HTTP)@en[[[X-CGI-*:]]]] 欄を受け取った時、これを無視したり、
削除したりして[['''構いません''']]。 [SRC[>>11]]
[17] 実際にこの種の[[ヘッダー]]がどれだけ存在し使われているのかは不明です。