簡単な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でも、どんな言語で書かれていても構いません。
最初の例は、一番シンプルな 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のページに取り込むことが出来るのです。
この例は、<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から呼んだとき、何が起こるか観察して下さい。
先の例は、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
ここでは、echoで一行づつ、HTMLの文書を作ろうというのではなく、 すでに出来ているHTML文書を、まるごとcatで出力しようとしています。
wwwサーバは、普通は、Pass指定子で決められたドキュメント・ルート以下に 存在するファイルしか、クライアントにサービス出来ませんが、こうした 方法を使うと、サーバから見える任意のファイルを、クライアントに提供 できます。
ただ、このスクリプトの実際の出力は、少し変ですね。その理由を 考えて下さい。
#!/bin/sh echo Content-type: text/html echo cat /usr/www/mosaic/httpd/docs/home_ja.html
実は、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は、必要か否か、削除して実験してみて下さい。