[Up] [Next] [Previous]

CGIの基礎

プログラミング言語の選択

CGIはプログラム(スクリプト)ですが、特に難しい知識は必要ではありません。 一般に CGIスクリプトを書く場合、次のようなプログラミング言語が用いられ ています。

CGIの骨組み

CGIスクリプトの結果は標準出力してHTML文書として表示させるか、サーバ側 のファイルに出力するかが考えられます。通常、HTML文書として結果を返す 事が多いので、標準出力に結果を表示します。後者は、アンケートのように後 で集計が必要な場合に用いられます。ただし、ファイルに書き込んだ場合も無 応答よりも何らかの返事を返す方が良いでしょう (例えば、『御協力ありがと うございました』)。

次にCGIスクリプトは最初の出力行に次の三つのうちのいずれかの特別なヘッ ダを含んでいます。

これらのヘッダの後は必ず空行が必要です。サーバは空行がないと、ヘッダと 書類の境がわからなくなり、処理ができなくなります。この空行は必ず忘れな いで下さい。

Content-type ヘッダはブラウザにHTMLファイルやGIFイメージ等を送る場合に 使われます。Content-type はブラウザに入力の処理をどのように行なうかを 知らせるためのものです。例えばHTMLファイルを返す場合、

Content-type: text/html
とし、GIFイメージを返す場合、
Content-type: image/gif
とします。このように Content-type は全てMIME形式で定義されています。

一般には次のContent-typeが使われます。

フォーマット Content-type
HTML text/html
Text text/plain
GIF image/gif
JPEG image/jpeg
PostScript application/postscript
MPEG video/mpeg
WWWで使用される主要な Content-typeヘッダ

Locationヘッダはサーバ上にある別の書類を開く場合に用いられます。なお、 書類の指定にはURLが用いられます。

Location: http://www.ntt.jp/index.html
Location: http://www.w3.org/
Location: /~yamada/profile/index.html
例えば、
#!/bin/sh

echo Location: http://www.ntt.jp/
echo
のようなCGIスクリプトを作っておけば、このCGIスクリプトを実行すると自動 的に、Locationに記述されたURL (NTTのWWWサーバ)に移動します(Location Demo)。これは、以下のアンカータグと同じ機 能を果たしますが、クライアント側で、どこに移動するかがわからない点に特 徴があります。
<A HREF="http://www.ntt.jp/">NTT WWWサーバへ</A>
例えば、10個のHTMLファイルをランダムに表示させたい場合、次のようなCGI スクリプト(Perl で記述)を作ればよい事がわかります (占いデモ)。

#!/usr/bin/perl

$unsei=10;

srand(time);
$number = int(rand($unsei));

print "Location: /technotes/HTML/uranai/unsei$number.html\n\n";

また、直前の書類へ戻るためのスクリプトも簡単に書く事もできます。CGIス クリプトで利用できる環境変数 HTTP_REFERER は、直前のページのURLを示す ものです(ただし、ブラウザによっては送出しないものがあります)から、以下 のようなスクリプトとなります。

#!/bin/sh

echo Location: $HTTP_REFERER
echo

最後の Statusヘッダはブラウザに特別な状態コードを返す場合に用いられま す。状態コードはHTTPの仕様で定義されています。例えば、ヘッダ

Status: 204 No Response
の意味は、サーバから何も応答がなかったという事を意味します。

CGIスクリプトの簡単な作成例

とても簡単な例として、サーバマシンに誰がログインしているかを表示する whologinというスクリプトを作成してみます。

次に、CGIスクリプトを呼ぶためのハイパーリンクを記述します。

<A HREF="/cgi-bin">Who login?</A>
これでCGIスクリプトを実行するポインタができました。

では、CGIスクリプトを作って見ます。最初の段階として、Content-type (HTML) のヘッダを出力します。

#!/bin/sh
echo "Content-type: text/html"
echo

ここで重要なことはヘッダの後に空行を忘れないことです!

その次にHTMLファイルの始まりを記述します。

echo "<HTML><HEAD>"
echo "<TITLE>Who is Login?</TITLE>"
echo "</HEAD><BODY>"

そして、本来の趣旨である whologinの本体 whoコマンドを 記述します。しかし、HTML が改行等を明示的に記述しなければならないので、 正しいフォーマットで表示されません。そのため、whoコマンドを整 形タグ(<PRE>)で囲みます。

echo "<PRE>"
who
echo "</PRE>"

最後にHTMLタグの終了タグで閉じます。

echo "</BODY></HTML>"

これで完成です。このスクリプトを chmod コマンドを使って、実行ファ イルにして、CGIスクリプトの置いてある場所にコピーします。

% chmod ugo+x whologin
% cp whologin /usr/local/etc/httpd/cgi-bin/

CGIスクリプトの引数

CGIスクリプトはコマンドやスクリプトを単に実行するだけではなく、引数を 持たせて実行できます。引数の表現方法は、スクリプトと引数を疑問符マーク (?)で区切り、個々の引数をプラスマーク(+)で区切ります。

<A HREF="/cgi-bin/script?arg1+arg2+arg3+...+argn">
と表します。サーバがスクリプト要求を受け取った時、arg1、arg2、arg3、...、 argn の引数をスクリプトに渡します。


[Up] [Next] [Previous]