[18] [DFN[CGI]] は、
[CODE[Common Gateway Interface]]
(共通関門界面) の略で、 [[HTTP]]
サーバーがスクリプトを実行してその結果を応答として返すための共通規格として
1993年に [[CGI/1.0]] が、
1994年に [[CGI/1.1]] (初版)
が策定されました。

[6] [[鯖]]側の [[Webアプリケーション]]構築技術の進化により、 [[CGI]]
の伝統的な[[子プロセス]]としての[[スクリプト]]実行は00年代以後廃れていきましたが、
かわって普及してきた[[HTTP鯖]]と同一[[プロセス]]で実行される形の
[[Webアプリケーション]]鯖の [[API]] や [[WAF]] の多くは [[CGI]]
から派生した形になっており、広義の [[CGI]] は現在も広く用いられていると言えます。

[EG[
[7] 例えば [[WSGI]] は [[CGI]] の[[メタ変数]]を拡張する形で採用しています。
]EG]

* CGI の版と派生仕様

[38] [[CGI]] には、 [[CGI/1.0]], [[CGI/1.1]], [[CGI/1.2]] の3つの版がありました。
[[CGI/1.0]] は初期の段階でのみ用いられました。 [[CGI/1.2]] は次世代版として企画されましたが、
完成に至りませんでした。実質的に [[CGI/1.1]] が唯一用いられている版です。

;; 詳細は「歴史」の項を参照。

[39] [[CGI]] は、事実上すべて [[HTTPサーバー]]で用いられています。
敢えて明確にするため [DFN[HTTP CGI]] ということもあります。
かつては他の[[プロトコル]]にも応用することが提案されており、
[[SIP]] での利用方法が一応は仕様化されています ([[SIP CGI]])。

;; 詳細は「歴史」の項を参照。

[43] 当初の [[CGI]] は、 [[UNIX]] 環境で[[HTTPサーバー]]から別の[[プロセス]]の
[[CGIスクリプト]]を起動する形で実装されており、そのための [[IPC]] 
の方法を規定するものでした。これが他の色々な[[プラットフォーム]]に移植された他に、
性能の改善などの目的で[[プロセス]]起動以外の方法でも実装されるようになりました。

[44] [[CGI]] の[[仕様]]はそうした派生的な実装方法も含めた一般的な形で規定しつつ、
[[UNIX]] ([[POSIX]]) と [[AmigaDOS]] の[[プロセス]]起動型の方法を定義していました。
ただ、派生実装はそれぞれの都合で元来の [[CGI]] の仕様をつまみ食いで踏襲する形になっており、
([[CGI]] 仕様の [[RFC]] 化がなかなか成らなかったこともあり)
それほど統一的に実装されているわけでもありません。また、 [[CGI]] = [[プロセス]]起動型
[[CGIスクリプト]]は遅いとして高速な代替手法であることを謳った技術も多く、
実質的に [[CGI]] の応用と言えるものであっても、 [[CGI]]
を名乗っていないことも多いです。

[45] ともかく、 [[CGI]] に基づく技術 ([[CGI]] の[[束縛]]とでもいうべき仕様や実装)
には、次のようなものがあります。

[FIG(list short)[
- [[プロセス]]起動型[[CGIスクリプト]]
-- [[UNIX]]
-- [[AmigaDOS]]
-- [[Windows]]
- [[SSI]]
-- [[UNIX]]
-- [[Windows]]
- [CODE(perl)@en[HTTP::Request::AsCGI]]
- [[WinCGI]]
- [[FastCGI]]
- [[SCGI]]
- [[WSGI]]
- [[Rack]]
- [[jsgi]]
- [[PSGI]]
- [[local CGI]]
- [[P6W]]
]FIG]


* CGI の構成要素

[10] 
[FIG(list middle)[
- [[HTTPサーバー]]
- [[CGIスクリプト]]
-- [[NPHスクリプト]]
- [[CGI要求]] (サーバーからスクリプトへ)
-- [[CGIメタ変数]]
-- [[要求データ]]
-- [[スクリプト命令行]]
- [[CGI応答]] (スクリプトからサーバーへ)
-- [[文書応答]]
-- [[局所リダイレクト応答]]
-- [[クライアントリダイレクト応答]]
-- [[NPH応答]]
-- [[CGIヘッダー]]
-- [[応答本体]]
]FIG]

* 歴史

** CGP

[11] [DFN[Common Gateway Protocol]] ([DFN[CGP]]) が [[CGI]] の考案当初の名称でした。

[REFS[
- [12] EMail Msg <9311180039.AA06991@void.ncsa.uiuc.edu> <http://ksi.cpsc.ucalgary.ca/archives/WWW-TALK/www-talk-1993q4.messages/515.html>
]REFS]

[13] Protocol ちゅーかむしろ Interface だろ、ってことで CGI という名前に変わった。

** CGI/1.0

[9] [DFN[[[CGI/1.0]]]] は [[CGI]] の最初の版です。
その後直ちに [[CGI/1.1]] となり、そちらが現在まで使われているため、
[[CGI/1.0]] の実装や応用は現在は残っていません。

- [4] ''WWW Talk Oct 93-present'' <http://ksi.cpsc.ucalgary.ca/archives/WWW-TALK/www-talk-1993q4.index.html> CGI/1.0 の仕様策定

[5] >>4 CGI/1.0 の仕様書って今は手に入らなさげなんですが、 CGI/1.1 との大きな違いは、 HTTP 頭欄が HTTP_* 環境変数で CGI script に渡されることと、 CGI script が出力した頭欄で CGI 頭欄でないものは HTTP 頭欄として HTTP UA に送られることみたいです。

[17] <http://ksi.cpsc.ucalgary.ca/archives/WWW-TALK/www-talk-1993q4.messages/515.html>: [[CGP]]/1.0 の最初の draft

** CGI/1.1

[16] [DFN[[[CGI/1.1]]]] は、現在使用されている [[CGI]] の版です。

[30] [[CGI]] には [[CGI/1.0]] と [[CGI/1.1]] がありますが、[[CGI/1.0]]
が開発された直後に [[CGI/1.1]] に更新されました。また、 [[CGI/1.2]] の開発も行われたことがありますが、
完成には至らず、今後も新しい版の予定はありません。従って、現存するすべての [[CGI]]
の実装は [[CGI/1.1]] です。

[REFS[
- [31] [CITE@en[[[RFC 3875]] - The Common Gateway Interface (CGI) Version 1.1]] 
<https://tools.ietf.org/html/rfc3875>
]REFS]

[32] 元々 [[CGI]] は [[NCSA]] の [[httpd]] の機能として実装され、すぐに改訂されて [[CGI/1.1]]
となりました。
長らく [[CGI]] の正式な仕様は存在せず、[[NCSA]] のドキュメントが事実上の標準となっていました。

[33] [[CGI]] の仕様を [[RFC]] 化しようとする動きは古くからありましたが、
中々進みませんでした。また、
[[ネットワーク]]の[[プロトコル]]ではなく[[鯖]]の内部の[[界面]]に過ぎないこともあって、
[[IETF]] における標準化を疑問視する声もありました。

[34] 結局長年の停滞の末に2004年10月にようやく [[CGI/1.1]] は[[情報提供RFC]]として発行されました。

[35] 標準不在の時代から様々な [[HTTP]] [[鯖]]ソフトウェアが [[CGI]]
の機能を実装していましたが、細かい動作の違いや独自の[[メタ変数]]の追加などがそれぞれで行われていました。
この状況は [[RFC]] 化された後も続いています。

[36] 現在では [[HTTP]] [[鯖]]が [[fork]] して [[CGIスクリプト]]を起動する伝統的な [[CGI]]
の実装方法は旧式のものと考えられており、各言語の[[ライブラリー]]や [[Webアプリケーション・フレームワーク]]、
あるいは[[HTTP]] [[鯖]]がそれぞれ独自の方法で[[鯖側Webアプリケーション]]との情報のやり取りを行うのが一般的となっています。
しかし、そのような現代的な [[API]] も、多かれ少なかれ [[CGI]] に影響を受けたものになっています。

[22] [CITE[RFC Errata Report » RFC Editor]], [TIME[2021-06-10T07:17:45.000Z]] <https://www.rfc-editor.org/errata_search.php?rfc=3875&rec_status=0>

** CGI/1.2

[14] [DFN[[[CGI/1.2]]]] は、[[CGI/1.1]] の [[RFC]] 化と並行して進められていた [[CGI]]
仕様の改訂案です。 [[Internet Draft]] が発行されていましたが、結局 [[RFC]]
化されることなくプロジェクトが頓挫したようです。

[REFS[
- [15] [CITE[Internet-Drafts Database Interface]] <https://datatracker.ietf.org/public/idindex.cgi?command=id_detail&id=3150>
- [37] <http://www.cs.huji.ac.il/course/2003/com1/rfc/draft-rfced-info-coar-00.txt>
]REFS]

** SIP CGI

[20] [DFN[[[SIP CGI]]]] は、 [[SIP]] のための [[CGI]] です。

[40] CGI は当初からプロトコル独立を謳ってきました [WEAK[([[Gopher]] とかでも使えることを意図していました)]]
が、 HTTP 以外で実質的な実装があったのかは不明でした。

[41] それがようやく日の目をみたといえるのか、 [[HTTP CGI]]
とは別に、 [[SIP]] で似たように働く
SIP CGI が [DFN[RFC 3050]] (2001)
として制定されました。 (HTTP
CGI RFC がいつまで経ってもできないので痺れを切らして先に
RFC 化してしまったような感じです。)

[46] 関連: [[仕様書の先行コピペ]]

[REFS[
- [42] [CITE@en[RFC 3050 - Common Gateway Interface for SIP]] ([TIME[2012-01-01 04:18:27 +09:00]] 版) <https://tools.ietf.org/html/rfc3050>
]REFS]

* メモ


[FIG(quote)[
[FIGCAPTION[
[27] [CITE@en[[[RFC 3875]] - The Common Gateway Interface (CGI) Version 1.1]] 
<http://tools.ietf.org/html/rfc3875>
]FIGCAPTION]

> [DFN[[RUBYB[共通関門界面]@en[Common Gateway Interface]]]] ([DFN[CGI]]) は、
[[情報鯖]]の元で外部の[[プログラム]]や[[ソフトウェア]]、[[関門]]を[[プラットフォーム]]独立な方法で実行するための、
簡単な[[界面]]です。現在、対応している[[情報鯖]]は [[HTTP]] [[鯖]]です。
]FIG]

[19] CGI/1.0 は歴史的なもので、
現在では既に影すらありません。
CGI/1.1 は、現代からみると曖昧な仕様であることと、
その後の時代の変化と現実の実装を反映する必要があることから、
[[IETF]] [[RFC]] で再定義することを目指して
[[Internet-Draft]] が書かれていますが、
作業は遅々として進まず、
当分 I-D のままと思われます。


- [1] ''Common Gateway Interface - 1.1 *Draft 03*'' <http://cgi-spec.golux.com/draft-coar-cgi-v11-03-clean.html>
- [2] ''The Common Gateway Interface Specification'' <http://hoohoo.ncsa.uiuc.edu/cgi/interface.html> (CGI/1.1) 
- [3] ''WWW Talk Jan 94-present'' <http://ksi.cpsc.ucalgary.ca/archives/WWW-TALK/www-talk-1994q1.index.html> CGI/1.1 の仕様策定
- [8] ''CGIのメカニズム (How a CGI Runs)'' <http://web.archive.org/web/20020203190929/www.dais.is.tohoku.ac.jp/~kabe/WWW/cgimech/cgi-mechanism.html>
- [21] <http://www.sambar.com/syshelp/cgi.htm>: [[Sambar]] という HTTP サーバーの実装について。

- [23] CGI: Common Gateway Interface part 11 <http://pc2.2ch.net/test/read.cgi/php/1055597189/> : 常に [[perl]] の侵蝕を受けているものの、基本的にはちゃんと違いを分かってる人がいるスレ。ちゃんと [[HTML]] とか [[HTTP]] とか [[URI]] のはなしをしている・・・ってそれだって CGI と違うやん(w
- [24] >>23 と高評価してしまったけどそうでもないみたい。たまたままともなところを読んだだけで全体的には厨ばっか。

[25]
[CITE[Shibuya Perl Mongers : Shibuya Perl Mongersテクニカルトーク#3]] <http://shibuya.pm.org/blosxom/techtalks/techtalks_200306.html#techtalks_200306>

[[Apache]] の [[mod_cgi]] の実装の非常に簡単な解説 (発表資料 PDF あり)。

[26]
[[iPlanet]] は [[CGIスクリプト]]の[[標準出力]]だけでなく、
[[標準誤り出力]]まで [[HTTP]] [[クライアント]]に送るそうです。。。

[28] [CITE[HTTP::Request::AsCGI - search.cpan.org]]
( ([TIME[2012-02-12 13:25:42 +09:00]] 版))
<http://search.cpan.org/dist/HTTP-Request-AsCGI/lib/HTTP/Request/AsCGI.pm>

[29] [CITE[WWW::Mechanize::CGI - search.cpan.org]]
( ([TIME[2012-02-12 13:27:05 +09:00]] 版))
<http://search.cpan.org/dist/WWW-Mechanize-CGI/lib/WWW/Mechanize/CGI.pm>