ブラウザ等のUser-Agentや特殊なWEBサーバの開発および試験では、User-AgentのHTTPリクエストに対し、任意のHTTPレスポンスを返す試験環境が必要です。
ここでは、CGI/perlを利用して任意のHTTPレスポンスを返す方法を説明します。
通常のCGIでは、CGIが呼び出すプログラム/スクリプトによって出力されたデータの前に、HTTPサーバによって作成されたHTTPレスポンスヘッダが付与されます。
たとえば、「test.cgi」というスクリプトが以下のように用意されているとします。
#!/usr/bin/perl print "Content-type: text/htmlr\n"; print "\r\n"; print "<html>\r\n"; print "<body>\r\n"; print "test.cgi\r\n"; print "</body>\r\n"; print "</html>\r\n"; exit(0);
このCGIに対し、以下のようにtelnetを利用してHTTPリクエストを上げてみます。
$ telnet www.kishiro.com 80 GET /test/nph-script/test.cgi HTTP/1.1 Host: www.kishiro.com
すると、こんな感じでレスポンスが返って来ます。
HTTP/1.1 200 OK Date: xxx, xx xxx xxxx xx:xx:xx GMT Server: Apache/1.3.xx (Unix) [中略] Content-type: text/html <html> <body> test.cgi </body> </html> Connection closed by foreign host.
このように、通常のCGI経由でのperlスクリプトでは、perlスクリプト側でHTTPレスポンスを記述しなくても、apache側でHTTPレスポンスを付与してクライアントに返却します。
上記動作はこれはこれでよいのですが、Webアプリによっては、CGI経由で返却するHTTPレスポンスにて、206/302等、任意のHTTPレスポンスを返したいケースがあります。
こういう場合には、NPH (Non Parsed Header) と呼ばれる機能を利用することにより、perlスクリプトで任意のHTTPレスポンスを記述してクライアントに返却することが可能です。
NPHというと難しく聞こえますが、利用するのは非常に簡単です。
下記のようなHTTPレスポンスを出力するperlスクリプトを作成し、それを接頭子「nph-」で始まるファイルに保存します。
#!/usr/bin/perl print "HTTP/1.0 200 OK\r\n"; print "Content-type: text/htmlr\n"; print "\r\n"; print "<html>\r\n"; print "<body>\r\n"; print "nph-test.cgi\r\n"; print "</body>\r\n"; print "</html>\r\n"; exit(0);
このCGIに対し、以下のようにtelnetを利用してHTTPリクエストを上げてみます。
$ telnet www.kishiro.com 80 GET /test/nph-script/nph-test.cgi HTTP/1.1 Host: www.kishiro.com
すると、今度はこんな感じでレスポンスが返って来ます。
HTTP/1.0 200 OK Content-type: text/html <html> <body> nph-test.cgi </body> </html> Connection closed by foreign host.
このように、ファイルに接頭子「nph-」をつけると、そのCGIはNPHとして扱われ、apache側ではHTTPレスポンスは補完されず、perlスクリプト側で記載されたHTTPレスポンスがそのまま返却されます。
・頂いたメッセージは管理者のチェックの後、公開されます。
・メッセージの公開を希望されない場合には、「このメッセージを非公開にする」にチェックを入れてください。
・管理者が不適切と判断したメッセージは公開しませんので、予めご了承ください。
まさにこれだ 4 (57%) |
これじゃない 3 (43%) |
【まさにこれだ】 NPH (Non-Parsed Header) スクリプトという単語をしらないまま、
偶然このページにたどりつくことができました。
知りたいことが判明してスッキリです!
ありがとうございます。 (2022/10/05 Wed 21:08:41)