世の中に CGI スクリプトは溢れていますが、それらは大抵、perl で書かれています。 しかし、べつに perl でしか書けないわけではないのですから、 他の言語にも目を向けてあげてもいいじゃないか、という 趣旨ではありません。 むしろ、perl の普及は望ましいことですが、 あれはなかなか憶えることが多くて大変な言語ですから、 初心者にはもっと簡単な言語がいいのではないかという、老婆心です。 でははじめましょう。
大変わがままで申し訳ありませんが、unix 上の gawk 3.0.3 +mb 1.11 に 話を限定 させていただきます。 もっと古いバージョンの gawk をお使いの方はこれを機会に最新版を インストールしましょう。
CGI とは、Common Gateway Interface のことです。 適当に訳すと「共通関門界面」(意味不明だ)。 要するに、やりとりのある web ページを提供できる仕掛けです。 具体的には、動かすプログラムには、環境変数を渡します。 プログラムはそれを見て、標準出力に書き込みます。 この枠組が利用できるなら、どのような言語を使っても構いません。
ところで、CGI は Internet-Draft の段階で、RFC にはなっていないようです。 現在流通しているのは version 1.1 です。
ついでに、HTTP の規格も読んでおきましょう。 HTTP 1.0 と HTTP 1.1 があります。 基本的に 1.0 に対応しておけば良いようです。
前節で見たように、入力は環境変数を参照します。 POSIX 以降の awk には、ENVIRON という環境変数を扱う配列が用意されています。 普通に print すると、標準出力に書き込まれます。 よって、awk で CGI を利用することができます。
素直に CGI の draft を読んだ人は判ると思いますが、 unix では CGI の入力は環境変数で渡されます。
これぐらい、あります。一番重要なのは QUERY_STRING です。 これが中心的な情報を教えてくれます。
では、実例です。次のスクリプトを、スクリプトを入れておくディレクト リー (これは各自で設定しましょう。)に置きます。test0.awk と名付けましょう。
#! /usr/local/bin/gawk -f BEGIN{ print "Content-Type: text/plain" print "" print "This is test" print 1,ENVIRON["AUTH_TYPE"] print 2,ENVIRON["CONTENT_LENGTH"] print 3,ENVIRON["CONTENT_TYPE"] print 4,ENVIRON["GATEWAY_INTERFACE"] print 5,ENVIRON["PATH_INFO"] print 6,ENVIRON["PATH_TRANSLATED"] print 7,ENVIRON["QUERY_STRING"] print 8,ENVIRON["REMOTE_ADDR"] print 9,ENVIRON["REMOTE_HOST"] print 10,ENVIRON["REMOTE_IDENT"] print 11,ENVIRON["REMOTE_USER"] print 12,ENVIRON["REQUEST_METHOD"] print 13,ENVIRON["SCRIPT_NAME"] print 14,ENVIRON["SERVER_NAME"] print 15,ENVIRON["SERVER_PORT"] print 16,ENVIRON["SERVER_PROTOCOL"] print 17,ENVIRON["SERVER_SOFTWARE"] }
勿論、実行権限を与えておいて下さい。 755 がよろしいでしょう。 それで、これのパスをブラウザーの Location のところ (GoTo とかかもしれない)に入れてみて下さい。 出てきた文字列の意味を以下で解説しましょう。 (というほどのことはないと思いますが)
ここには何も現れてなかったかも知れません。 認証が必要な時にここをチェックしましょう。 規格には Basic という type だけがあります。
POST メソッド(後述)で送られた情報を受けとる時に利用します。
CGI/1.1 と表示されていることでしょう。 1.2 とかになっていたら、この解説ではなく他のところを読んだ方が良いでしょう。
重要だ、と言ったのにからっぽで意外な感じがするかも知れません。
これは、url の後ろに
? で始まる文字列を入れた時にそれがそのまま渡されるものです。ですから、
http://www.hoge-u.ac.jp/cgi-bin/test.awk?foo=bar
などとすると、test.awk に渡される QUERY_STRING が foo=bar になります。
実行させようとした人の情報が得られます。 組織の内部の人にしか実行させたくないなどという時に利用できるでしょう。
要求に使った HTTP のメソッドです。 GET がよく使われます。 それから POST。 test.awk では GET と出ていたはずです。 QUERY_STRING はこれが GET の時に使うものなのです。
もうこれは、動いているスクリプトの名前です。 (コンパイルされた c のプログラムでもスクリプトなのですが、 その辺りの用語の使い方は規格を参照して下さい。)
CGI スクリプトを呼び出したサーバーの情報です。 SERVER_PROTOCOL は HTTP/1.0 か HTTP/1.1 だと思います。 どちらでも、CGI/1.1 で使えます。
「頭書き」などという変な訳をつけてみましたが、英語では header です。 次のうち少なくとも一つは書かないといけません。
これら以外に(要求が HTTP でされているならば) 任意の HTTP 頭書きを書いて構いません (Location を指定した時には書いてはいけませんが)。
こういう見出しを作るということが暗に何かあるということを示していますが、 頭書きと本文の間には必ず空行がなければいけません。
何を書いても結構です。 但し、Content-Type と整合していることが必要です。 従って、Content-Type が指定されていなければ、本文は空でなければなりません。
質問メールは大歓迎ですが、 必ずしもお答えできる自信はありません(苦笑)