[1] いわゆる nph-cgi は、HTTP 鯖が CGIスクリプトの用意した応答メッセージを (ほぼ) そのまま編集せずに HTTP 応答メッセージとして返すような CGI の仕組み、あるいはそれを利用した CGIスクリプト、あるいは CGIスクリプトがそのように実行されるよう設定されたディレクトリーのことです。
[2] 通常、HTTP 鯖は CGIスクリプトの応答 (標準出力に出力されたバイト列)
をそのまま HTTP 応答としてクライアントに返すのではなく、
状態行を付与したり、CGI頭欄を処理したり、
Date:
や Server:
のような追加の HTTP頭欄を補ったりしてから HTTP
応答メッセージとしてクライアントに返します。
nph-cgi はこれらの処理をできるだけ省きます。
[3] もともとは「できるだけ」ではなく本当にそのまま返すのが想定された実装だったようですが、 HTTP/1.1 で chunked符号化が導入されるなど、クライアントからの要求に応じて HTTP 鯖が行うべき処理が増え、それらすべてを CGIスクリプト側で処理させることは現実的でないために、 今では nph-cgi であってもある程度の後処理を HTTP 鯖が行うのが一般的です。 要出典
[5] 鯖は NPH (Non-Parsed Header) スクリプトに対応しても構いません >>4。
[7] NPHスクリプトか通常のCGIスクリプトかは、実装定義の方法によって決まります。 >>4
[8] 伝統的にはCGIスクリプトの名前が nph-
ではじまればNPH、
のような名前によって区別する方法が採られてきました。
[11] NPHスクリプトは鯖にかわって適切な応答を構築する責任を持ちます。 スクリプトが鯖に (ひいてはクライアントに) 応答を返す方法はシステム定義です。 特段の定めがない限り、これは通常の CGIスクリプトの場合と同じ方法となります。 >>4
[12] NPHスクリプトは HTTP に関してのみ定義されており、完全な HTTP
応答メッセージを返さなければなりません。
SERVER_PROTOCOL
メタ変数に応じて適当な形式とする必要がありますし、
その他各種のメタ変数もプロトコル仕様に従い適宜考慮する必要があります。 >>4
[13] 鯖はスクリプトの出力が修正なしにクライアントに送られるようにしなければなりません。 鯖はこれをできるだけ少ない内部のバッファリング、およびトランスポート層から見えるバッファリング無しでクライアントへと送信するべきです。 >>4
[14] スクリプトは、別途実装定義が無い限り、クライアントが同じ接続で更に次の要求を送っても良いと応答で示してはなりません。 >>4
[9] 元々は CGI の応答のHTTP鯖による後処理のオーバーヘッドを削減することが狙いだったと思われますが、 現在となってはその必要性もほとんど無いだろうこと、 CGI 自体が使われなくなって来ていること、 本当に応答の性能が問題となるなら FastCGI、 mod_*、 独自のアプリケーション鯖などその後 CGI にかわって使われるようになった技術を使う方がより良いだろうことなどより、 NPH もほとんど使われなくなって来ているものと思われます。