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