IIS の非解析ヘッダ (nph) CGI

あまりに地味すぎて (?) 誰も語ることのない、非解析ヘッダ (nph) CGI の動作を、IIS 7.0 を使って確認しましょう。

非解析ヘッダ (nph) CGI とは?

通常は Content-Length など、CGI をホストする Web サーバがヘッダを入れ込んだほうが何かと便利である状況が多いため、 通常は Web サーバは CGI からの出力を受け取り、クライアントにデータを送信する前に HTTP ヘッダを操作します。 これがデフォルトの動作です。

しかし HTTP ではデータ (ボディ) だけではなく、ヘッダで情報を伝達する必要がある場合があります。 CGI プログラムで行える作業の自由度を高めるためには、HTTP ヘッダ部分も全て (Web サーバに干渉されることなく) 自由に操作できたほうが都合が良い場合があります。

非解析ヘッダ (Non Parsed Header, nph) CGI というのは、Web サーバーに対して 「HTTP ヘッダをいじらないでくださいね」 と指示する類の CGI プログラムを指します。

IIS では、CGI プログラム (EXE) の実行ファイル名に、nph- という文字をつけることによって、 全く同じ EXE が nph CGI として実行されます。

通常の CGI の場合

それではまず、nph CGI の動作を見る前に、通常の CGI がどのように動作するのか見てみましょう。

まずは非常に単純な CGI を作りましょう。ソースコードは次の通りです。

#include <stdio.h>

int main(int argc, char* argv[] ) {

     printf("Content-Type: text/plain\n");
     printf("\n");
     printf("Hello!");

     return 0;

}

これを mycgi.cpp として保存し、EXE を作ります。(あまりに単純なので makefile 無しで、いきなり cl します)

> cl mycgi.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

mycgi.cpp
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:mycgi.exe
mycgi.obj

こうしてできた mycgi.exe を、nph-mycgi.exe という名前でコピーします。 バイナリとしては全く同じものです。

CGI が IIS で動くように IIS に登録します。(詳細は割愛します)

この状態で、通常の CGI を要求します。HTTP ヘッダがみやすいように、WFetch を利用します。

すると、以下の図のように IIS が複数の HTTP ヘッダ行を追加していることがわかります。

nph CGI の場合

それでは nph CGI の場合に、HTTP ヘッダがどうなるかみてみましょう。

上で作成した nph-mycgi.exe を要求します。(中身は mycgi.exe と全く同じで、ファイル名が異なるだけのものです)

このように、HTTP ヘッダは手付かずのまま、クライアントに送信されてきます。

いろいろと新しいテクノロジに目がいきがちですが、こうした地味な業界標準的な機能もしっかり実装されています。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説