next up previous contents
Next: 引数を渡す Up: CGI Previous: CGIのメカニズム

簡単なCGIサンプル

簡単なCGIのサンプルをいくつか実際に作ってみることにしましょう。 ~/summer95/wwwの下にcgi-binというディレクトリをつくり、Exec指定子で、 このディレクトリ下のファイルが、/cgi-binというバーチャル・パスの下に 見えるように、CGIの設定がなされているとしましょう。

 
Exec /cgi-bin/*  /net/lx/summer95/www/cgi-bin/*

以下のGatewayプログラムを、このディレクトリの下に、cgi.NNという名前で 置いて、実行してみて下さい。ここでのプログラムは、簡単なシェル・スクリプト で書かれています。ファイルを編集した後、実行可能属性を立てることを忘れない でください。Mosaicから、URL名で呼び出す前に、直接、コマンドラインから これらのGatewayプログラムを実行してみて、出力をチェックしてください。

 
lxj6$ mkdir ~/summer95/www/cgi-bin     <--- cgi directory 作成
lxj6$ cd    ~/summer95/www/cgi-bin
lxj6$ vi    cgi.1                           <--- Gateway program 作成
   ......
  (編集)
   ......
lxj6 chmod +x cgi.1                         <--- 実行可能属性のセット
lxj6$ cgi.1                                 <--- スクリプトの実行
   ......
 (出力)
   ......

ここでの例は、全て、シェルで書かれていますが、Gatewayプログラムは、 標準出力に、httpのヘッダと本体を書き出せるものであれば、Cでも、 Perlでも、tclでも、どんな言語で書かれていても構いません。

cgi.1 ........ text/plain で出力

最初の例は、一番シンプルな Media typeである、text/plain で、出力を 行うものです。実際に、呼ばれているのは、コマンドdateと、コマンド ls -l で、それらの出力がサーバからクライアントに送られ、Mosaicのページに 表示されます。

 
#!/bin/sh
echo Content-type: text/plain
echo
date
echo "................................." 
ls -l 
echo "................................."

External Viewerを使えば、UNIXのコマンドをMosaicから起動することが 出来ることは、先に学びましたが、CGIを使えば、UNIXコマンドの出力を Mosaicのページに取り込むことが出来るのです。

cgi.2 ........ text/html で出力

この例は、<TITLE>,</TITLE>,<H1>,</H1>...といったHTMLの表現を みて分かるように、HTMLのドキュメントを生成します。 このスクリプトは、内部で、sleepを呼んでいます。dateの3つの出力は、 それぞれ、少なくとも一秒は、ずれているはずです。

こうしたスクリプトを沢山書いていると、つい、先頭の echo を忘れてしまう ことがあります。今、書いているのは、HTMLのドキュメントそのものではなく、 HTMLのドキュメントを標準出力に出力するプログラムだ ということを忘れないで下さい。

HTMLには、"<"や">"が頻出するのですが、これらのキャラクターは、シェルの中で、 特別の意味をもっています。これらを含む文字列をechoで出力するとき、 クォートするのを忘れると、シェルがとんでもない勘違いをすることがあります。 この点も注意して下さい。

 
#!/bin/sh
echo Content-type: text/html
echo
echo "<TITLE>時間差</TITLE>"
echo "<H1>"
date
echo "</H1>"
echo "<HR>"
echo "<H2>"
sleep 1
date
echo "</H2>"
echo "<HR>"
sleep 1
date

Mosaic側で表示されるのは、このcgi.2をコマンドラインから起動したときに 出力されるドキュメントそのものではなく、Mosaicが、それをHTML文書として 解釈した結果です。

次に、このファイルcgi.2を、ファイルcgi.2xというファイルにコピーして下さい。 そして、新しいファイルcgi.2xの、Content-typeを、text/htmlから、text/plain に一箇所だけ変更します。 そして、このGatewayスクリプトをURLから呼んだとき、何が起こるか観察して下さい。

cgi.3 ........ image/gif で出力

先の例は、Mosaicでの表示は、Gatewayプログラムが付加する、ヘッダのContent-type に記される、データのMedia type情報に大きく左右されることを示しています。

実際に作成されるGatewayプログラムの多くは、text/html型のドキュメントを 生成するものでしょうが、そうでないタイプのCGIも可能です。 ここでは、Content-typeが、image/gif型の例を挙げておきます。

 
#!/bin/sh
echo Content-type: image/gif
echo
cat /usr/www/mosaic/httpd/docs/hokusei.gif

cgi.4 ........ HTML文書を出力

ここでは、echoで一行づつ、HTMLの文書を作ろうというのではなく、 すでに出来ているHTML文書を、まるごとcatで出力しようとしています。

wwwサーバは、普通は、Pass指定子で決められたドキュメント・ルート以下に 存在するファイルしか、クライアントにサービス出来ませんが、こうした 方法を使うと、サーバから見える任意のファイルを、クライアントに提供 できます。

ただ、このスクリプトの実際の出力は、少し変ですね。その理由を 考えて下さい。

 
#!/bin/sh
echo Content-type: text/html
echo
cat /usr/www/mosaic/httpd/docs/home_ja.html

cgi.5 ........ Location: URL

実は、CGIには、今まで見てきたような、ヘッダにContent-typeを書く以外の もう一つのスタイルがあります。 それは、次の例のように、Location: の後に直接、URLを指定するというものです。

ここで呼び出されているURLは、サーバwww.wakhok.ac.jpでは、先のcgi.4 で、catで出力されたファイルと同じものです。しかし、今回は、前回のように、 相対パス指定の解釈を間違うということはありません。

ここでの例は、識別子 .html をもつtype/html型のリソースを呼び出すと 言うものでしたが、このLocation指定で、.gifや、.mpegといった適当な リソースを、URLで指定して見て下さい。

 
#!/bin/sh
echo Location: http://www.wakhok.ac.jp/home_ja.html
echo

このスクリプトでは、二つのechoが使われています。 二つ目のechoは、必要か否か、削除して実験してみて下さい。




1995年08月02日 (水) 17時52分49秒 JST