![]()
CGIの基礎
プログラミング言語の選択
CGIはプログラム(スクリプト)ですが、とくに難しい知識は必要ありません。一般的にCGIスクリプトを書く場合、次のようなプログラミング言語を用います。
- Shell (sh, csh, tcsh, bash, zshなど):Sed, Grep, Awk などと組み合わせます。
- Perl:Perl にはCGIの引数を取り出すライブラリなどもあり、もっとも一般的な言語です。
- C
- Tcl/Tk: Tk を使用するとブラウザ以外のウィンドウインタフェースを提供できます。
- Python
- AppleScript:マッキントッシュで利用されます。
CGIの骨組み
CGIスクリプトの結果は標準出力してHTML文書として表示させるか、サーバ側のファイルに出力するかが考えられます。通常、HTML文書として結果を返すことが多いので、標準出力へ結果を表示します。後者はアンケートのような後で集計が必要な場合に用います。ファイルに書き込んだ場合も無応答より、たとえば「ご協力ありがとうございました」といった何らかの返事を返す方が親切です。次にCGIスクリプトは最初の出力行に次の3つのうち、いずれかの特別なヘッダを含んでいます。
これらのヘッダの後は必ず空行が必要です。サーバは空行がないと、ヘッダとテキストの境がわからなくなり、処理ができなくなります。この空行は必ず忘れないで下さい。
- Content-type
- Location
- Status
Content-typeヘッダはブラウザにHTML文書やGIFイメージなどを送る場合に使われ、ブラウザへ入力処理をどのように行なうかを知らせます。たとえばHTML文書を返す場合なら、
Content-type: text/htmlGIFイメージを返す場合なら、Content-type: image/gifこのように、すべてのContent-typeはMIME形式で定義されており、ふつう次のContent-typeが使われます。
WWWで使用される主要な
Content-typeヘッダ
フォーマット Content-type HTML text/html Text text/plain GIF image/gif JPEG image/jpeg PostScript application/postscript MPEG video/mpeg
Locationヘッダはサーバ上にある別の文書を開く場合に用いられ、文書はURLで指定します。
Location: http://www.yokochin.com/index.html Location: http://www.w3.org/ Location: /~yokochin/profile/index.htmlたとえば、#!/bin/sh echo Location: http://www.yokochin.com/ echoこのようなCGIスクリプトを作っておけば、このCGIスクリプトを実行すると自動的にLocationのURL(筆者のWWWサーバ)へ移動します。つまり、以下の<a>(アンカー)タグと同じ機能を果たしますが、クライアント側にはどこへ移動するかわからない点が特徴です。<a href="http://www.yokochin.com/">YokochinのWWWサーバへ</a>たとえば、10個のHTML文書をランダムに表示させたい場合、次のようなCGIスクリプトをPerlで記述します。また、直前の書類へ戻るためのスクリプトなら、CGIスクリプトで利用できる環境変数http_refererは直前のページのURLを示すので、以下のように記述します。ただ、ブラウザによっては送出しないものがあるので注意してください。#!/usr/bin/perl $unsei=10; srand(time); $number = int(rand($unsei)); print "Location: /technotes/HTML/uranai/unsei$number.html\n\n";
最後のStatusヘッダはブラウザへ特別な状態コードを返す場合に用いられます。状態コードはHTTPの仕様で定義されています。たとえば、#!/bin/sh echo Location: $http_referer echo
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文書の始まりを記述します。
そして、本来の趣旨であるwhologinの本体whoコマンドを記述します。しかし、HTMLが改行などを明示的に記述しなければならないので、正しいフォーマットで表示されません。そのため、whoコマンドを<pre>(整形)タグで囲みます。echo "<html><head>" echo "<title>Who Login?</title>" echo "</head><body>"
最後にHTMLタグの終了タグで閉じます。echo "<pre>" who echo "</pre>"
これで完成です。このスクリプトをchmodコマンドを使って実行ファイルにし、CGIスクリプトの置いてある場所へコピーします。echo "</body></html>"
% 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の引数をスクリプトへ渡します。