共通関門界面

CGI (Web)

[18] CGI は、 Common Gateway Interface (共通関門界面) の略で、 HTTP サーバーがスクリプトを実行してその結果を応答として返すための共通規格として 1993年に CGI/1.0 が、 1994年に CGI/1.1 (初版) が策定されました。

[6] 側の Webアプリケーション構築技術の進化により、 CGI の伝統的な子プロセスとしてのスクリプト実行は00年代以後廃れていきましたが、 かわって普及してきたHTTP鯖と同一プロセスで実行される形の Webアプリケーション鯖の APIWAF の多くは CGI から派生した形になっており、広義の CGI は現在も広く用いられていると言えます。

[7] 例えば WSGICGIメタ変数を拡張する形で採用しています。

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サーバーで用いられています。 敢えて明確にするため 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束縛とでもいうべき仕様や実装) には、次のようなものがあります。

CGI の構成要素

[10]

歴史

CGP

[11] Common Gateway Protocol (CGP) が CGI の考案当初の名称でした。

[13] Protocol ちゅーかむしろ Interface だろ、ってことで CGI という名前に変わった。

CGI/1.0

[9] CGI/1.0CGI の最初の版です。 その後直ちに CGI/1.1 となり、そちらが現在まで使われているため、 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] CGI/1.1 は、現在使用されている CGI の版です。

[30] CGI には CGI/1.0CGI/1.1 がありますが、CGI/1.0 が開発された直後に CGI/1.1 に更新されました。また、 CGI/1.2 の開発も行われたことがありますが、 完成には至らず、今後も新しい版の予定はありません。従って、現存するすべての CGI の実装は CGI/1.1 です。

[32] 元々 CGINCSAhttpd の機能として実装され、すぐに改訂されて 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] RFC Errata Report » RFC Editor, https://www.rfc-editor.org/errata_search.php?rfc=3875&rec_status=0

CGI/1.2

[14] CGI/1.2 は、CGI/1.1RFC 化と並行して進められていた CGI 仕様の改訂案です。 Internet Draft が発行されていましたが、結局 RFC 化されることなくプロジェクトが頓挫したようです。

SIP CGI

[20] SIP CGI は、 SIP のための CGI です。

[40] CGI は当初からプロトコル独立を謳ってきました (Gopher とかでも使えることを意図していました) が、 HTTP 以外で実質的な実装があったのかは不明でした。

[41] それがようやく日の目をみたといえるのか、 HTTP CGI とは別に、 SIP で似たように働く SIP CGI が RFC 3050 (2001) として制定されました。 (HTTP CGI RFC がいつまで経ってもできないので痺れを切らして先に RFC 化してしまったような感じです。)

[46] 関連: 仕様書の先行コピペ

メモ

[27] RFC 3875 - The Common Gateway Interface (CGI) Version 1.1 http://tools.ietf.org/html/rfc3875

共通関門界面 (Common Gateway Interface) (CGI) は、 情報鯖の元で外部のプログラムソフトウェア関門プラットフォーム独立な方法で実行するための、 簡単な界面です。現在、対応している情報鯖HTTP です。

[19] CGI/1.0 は歴史的なもので、 現在では既に影すらありません。 CGI/1.1 は、現代からみると曖昧な仕様であることと、 その後の時代の変化と現実の実装を反映する必要があることから、 IETF RFC で再定義することを目指して Internet-Draft が書かれていますが、 作業は遅々として進まず、 当分 I-D のままと思われます。

[25] Shibuya Perl Mongers : Shibuya Perl Mongersテクニカルトーク#3 http://shibuya.pm.org/blosxom/techtalks/techtalks_200306.html#techtalks_200306

Apachemod_cgi の実装の非常に簡単な解説 (発表資料 PDF あり)。

[26] iPlanetCGIスクリプト標準出力だけでなく、 標準誤り出力まで HTTP クライアントに送るそうです。。。

[28] HTTP::Request::AsCGI - search.cpan.org ( ( 版)) http://search.cpan.org/dist/HTTP-Request-AsCGI/lib/HTTP/Request/AsCGI.pm

[29] WWW::Mechanize::CGI - search.cpan.org ( ( 版)) http://search.cpan.org/dist/WWW-Mechanize-CGI/lib/WWW/Mechanize/CGI.pm