[1] いわゆる [DFN[nph-cgi]] は、[[HTTP]] [[鯖]]が [[CGIスクリプト]]の用意した[[応答メッセージ]]を (ほぼ)
そのまま編集せずに [[HTTP]] [[応答メッセージ]]として返すような [[CGI]]
の仕組み、あるいはそれを利用した [[CGIスクリプト]]、あるいは [[CGIスクリプト]]がそのように実行されるよう設定された[[ディレクトリー]]のことです。

[2] 通常、[[HTTP]] [[鯖]]は [[CGIスクリプト]]の[[応答]] ([[標準出力]]に出力された[[バイト列]])
をそのまま [[HTTP]] [[応答]]として[[クライアント]]に返すのではなく、
[[状態行]]を付与したり、[[CGI頭欄]]を処理したり、
[CODE(HTTP)@en[[[Date:]]]] や [CODE(HTTP)@en[[[Server:]]]]
のような追加の [[HTTP頭欄]]を補ったりしてから [[HTTP]]
[[応答メッセージ]]として[[クライアント]]に返します。
[[nph-cgi]] はこれらの処理をできるだけ省きます。

[3] もともとは「できるだけ」ではなく本当にそのまま返すのが想定された実装だったようですが、
[[HTTP/1.1]] で [[chunked符号化]]が導入されるなど、[[クライアント]]からの[[要求]]に応じて [[HTTP]]
[[鯖]]が行うべき処理が増え、それらすべてを [[CGIスクリプト]]側で処理させることは現実的でないために、
今では [[nph-cgi]] であってもある程度の後処理を [[HTTP]] [[鯖]]が行うのが一般的です。
[SRC[要出典]]

;; [[HTTP/2]] と [[NPH]] を両方実装するには [[HTTP鯖]]側で [[NPH応答]]から
[[HTTP/2]] [[応答]]への変換を実装せざるを得ないはずです。

* 仕様書
[REFS[
- [4] [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-5>
]REFS]

* 処理

[5] [[鯖]]は [[NPH]] (Non-Parsed Header) [[スクリプト]]に対応しても[['''構いません''']] [SRC[>>4]]。

;; [6] 必須ではありません。

** 識別

[7] [[NPHスクリプト]]か通常の[[CGIスクリプト]]かは、[[実装定義]]の方法によって決まります。
[SRC[>>4]]

[8] 伝統的には[[CGIスクリプト]]の名前が [CODE[nph-]] ではじまれば[[NPH]]、
のような名前によって区別する方法が採られてきました。

[17] [[WebSTAR]] や [[IIS]] は最初の行によって決定するそうです。

;; [18] [[RFC 3875]] は[[スクリプト]]の出力によって決めることはできないと言っていますが、
実際には [[CGI応答]]には表れない[[状態行]]が [[HTTP応答]]には存在するので区別できるはずです。

** NPH 応答

[11] [[NPHスクリプト]]は[[鯖]]にかわって適切な[[応答]]を構築する責任を持ちます。
[[スクリプト]]が[[鯖]]に (ひいては[[クライアント]]に) [[応答]]を返す方法は[[システム定義]]です。
特段の定めがない限り、これは通常の [[CGIスクリプト]]の場合と同じ方法となります。 [SRC[>>4]]

[12] [[NPHスクリプト]]は [[HTTP]] に関してのみ定義されており、完全な [[HTTP]]
[[応答メッセージ]]を返さなければ[['''なりません''']]。 
[CODE(CGI)@en[[[SERVER_PROTOCOL]]]] [[メタ変数]]に応じて適当な形式とする[['''必要''']]がありますし、
その他各種の[[メタ変数]]もプロトコル仕様に従い適宜考慮する[['''必要''']]があります。 [SRC[>>4]]

[13] [[鯖]]は[[スクリプト]]の出力が修正なしに[[クライアント]]に送られるようにしなければ[['''なりません''']]。
[[鯖]]はこれをできるだけ少ない内部のバッファリング、および[[トランスポート層]]から見えるバッファリング無しで[[クライアント]]へと送信する[['''べきです''']]。
[SRC[>>4]]

[14] [[スクリプト]]は、別途[[実装定義]]が無い限り、[[クライアント]]が同じ[[接続]]で更に次の[[要求]]を送っても良いと[[応答]]で示しては[['''なりません''']]。
[SRC[>>4]]

;; [15] つまり[[持続接続]]や [[Keep-Alive]] を使ってはいけません。

;; [16] [[鯖]]が [[chunked]] など[[転送符号化]]を勝手に行って良いとは読めませんが、実際にはどうなっているのでしょうか。

* 歴史

[9] 元々は [[CGI]] の[[応答]]の[[HTTP鯖]]による[[後処理]]の[[オーバーヘッド]]を削減することが狙いだったと思われますが、
現在となってはその必要性もほとんど無いだろうこと、
[[CGI]] 自体が使われなくなって来ていること、
本当に応答の性能が問題となるなら [[FastCGI]]、 [[mod_*]]、
独自の[[アプリケーション鯖]]などその後 [[CGI]] にかわって使われるようになった技術を使う方がより良いだろうことなどより、
[[NPH]] もほとんど使われなくなって来ているものと思われます。

* メモ

[10] [CITE[Apple Computer]], [TIME[2025-11-25T15:27:33.000Z]], [TIME[1999-11-17T02:43:03.428Z]] <https://web.archive.org/web/19991117024224/http://apple.com/>

>
[PRE[
						<!-- WORLDWIDE PULL-DOWN MENU -->
						<form method="POST" action="https://web.archive.org/web/19991117024224/http://www.apple.com/cgi-bin/nph-menu">
						Visit other Apple sites around the world: <select name="worldwide" size="1" onchange="location.href=this.form.worldwide.options[this.form.worldwide.selectedIndex].value">
							<option selected value="/find/#world">Choose...				<option value="http://www.asia.apple.com/">Asia
]PRE]



