2006 年 9 月 2 日 23 時 52 分

CGI の動作


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


[写真]


今日は、CGI の動作を具体的に見てみよう。
Web サーバの環境としては、Apache + Perl を使う。

Apache は代表的な Web サーバソフトウェアであり、
一般的な設定では、cgi の拡張子を持つファイルを、
CGI プログラムとして呼び出すことができる。

では、受け取ったクエリ文字列を、
そのまま出力するプログラムを作ってみよう。

========== hello.cgi ==========
#!/usr/local/bin/perl

print "Content-Type: text/plain\n";
print "\n";

print $ENV{'QUERY_STRING'};
========== end of hello.cgi ==========

短いプログラムだが、CGI の重要な点が含まれている。

1 行目の #! から始まる行が shebang であり、
ソースファイルを処理するプログラムを指定している。
/usr/local/bin/perl は、perl のインタプリタだ。
これは、シェルの流儀である。

3 行目の print 関数は「標準出力」に書き出す命令だ。
CGI の決まりにより、CGI プログラムは、
HTTP のヘッダ行から出力を開始する必要がある。
また、そのデータは標準出力に書き出す。

CGI プログラムの出力結果は、Web サーバに渡されるので、
すべてのヘッダを出力する必要はない。
Web サーバが CGI プログラムの出力に追加編集した上で、
最終的にレスポンスが返される仕組みとなっている。

大半の CGI プログラムは、何かしらのデータを返すので、
HTTP のエンティティヘッダ「Content-Type」が必要だ。

今回は、渡されたクエリ文字列をそのまま出力するので、
書式のない普通のテキスト形式として出力しよう。
普通のテキストの MIME タイプは、「text/plain」だ。

HTTP ヘッダは、CR-LF の 2 文字で改行する必要があるが、
CGI プログラムは LF(UNIX の改行)で改行して構わない。
Web サーバ側が CR-LF に変換する決まりとなっている。

Perl では C 言語と同様、"\n" が OS 依存の改行を表す。
Perl の場合、UNIX でも Windows でも LF なので、
上記のプログラムは、UNIX と Windows 両方で動作する。
正式に書くなら、"\x0d\x0a" と CR-LF を明示すべきだ。

HTTP ヘッダは、空の改行で終了するので、
4 行目で CGI プログラム側でも空の改行を出力し、
ヘッダの終了を明示している。

6 行目(最終行)で出力しているのが、
実際の本体(メッセージボディ)となる。

Perl では $ENV{'QUERY_STRING'} は、
QUERY_STRING という名前を持つ環境変数の値を意味する。
QUERY_STRING には、リクエストされた URL の
クエリ文字列(? 以降)の内容が格納されている決まりだ。

さて、このスクリプトを動かしてみよう。
まずファイルを CGI を実行可能なディレクトリに配置し、
パーミッションを 755 等にして実行可能にする。

では、Fiddler を併用して動作を眺めてみよう。
例として、以下の URL に配置してみた。
この URL には、クエリ文字列を含めてある。
Fiddler を起動し、ブラウザで以下にアクセスする。

http://loafer.jp/mixi/echo-query.cgi?parameter=value

ブラウザには、「parameter=value」と
そっけない文字列が表示されたはずだ。
MIME タイプが text/plain なので、
Web ブラウザはテキストデータとして認識し、
それに対応した表示(等幅など)で表現するはずである。

では Fiddler からサーバの応答を眺めてみよう。

========== Response ==========
HTTP/1.1 200 OK
Date: Sat, 02 Sep 2006 14:54:16 GMT
Server: Apache
Connection: close
Content-Type: text/plain; charset=us-ascii
Content-Language: ja

parameter=value
========== end of Response ==========

結果は、上のようになった。

先頭にあるステータス行は、Web サーバが出力したものだ。
また、ヘッダ行にも CGI が出力していないものが
色々追加されているのが分かる。

「Content-Type」ヘッダにも、
charset パラメータが追加されており、
文字エンコーディングが明示されている。
これらも、Web サーバが編集して追加したものである。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.