これまで、CGIプログラムに、どのように引数を与えるかという問題を
見てきましたが、実は、CGIはもう少し一般的なメカニズムを用意しています。
とはいっても、コマンドと引数というメカニズムにしても、それ自身、ずいぶん
一般的なものですので、それ以外にも別なメカニズムがあると言われても、ピンと
こないかもしれません。
先に、CGIが呼ばれたときhttpdが行うURLの解釈の仕方を説明しましたが、その時は、 何も説明がなかったのですが、"PATH_INFO"という言葉が出てきました。
その後にまだ文字列が残っていれば、その文字列中に、記号'?'が出現するまでの 文字列を、環境変数 PATH_INFOに、記号'?'から後ろの文字列を、環境変数 QUERY_STRINGに設定します。
次のプログラムは、先のプログラムcgi.arg2と、ほとんど同じ働きですが、 環境変数QUERY_STRING に加えて、PATH_INFOとPATH_TRANSLATEDを表示する ものです。
#include<stdio.h> main(argc,argv) int argc; char *argv[]; { int i; printf("Content-type: text/html\n\n"); printf("<TITLE>PATH_INFO and PATH_TRANSLATED</TITLE>\n"); printf("<H2>QUERY_STRING = %s</H2>\n",getenv("QUERY_STRING")); printf("<H2>PATH_INFO = %s</H2>\n",getenv("PATH_INFO")); printf("<H2>PATH_TRANSLATED = %s</H2>\n",getenv("PATH_TRANSLATED")); printf("<HR>\n"); for( i = 0; i < argc ; i++ ){ printf("argv[%d] = %s <P>\n",i,argv[i]); } }
もう一つの違いは、これがC言語で書かれている点です。前にも述べたように、 標準出力に出力を行うプログラムであれば、どんな言語を使っても構いません。 次の手順で、cgi.arg3を作成し、必ずcgi-binディレクトリに置いて下さい。。
# vi cgi_arg3.c # gcc -o cgi.arg3 cgi_arg3.c
cgi.arg3がコンパイルできたら、次のようなURLを与えて、このcgi.arg3を
呼び出し、どのような処理が行われているのか、見当をつけてみて下さい。
なお、ホスト名や<user>
の部分は、自分のホスト名やユーザー名に置き換えて
下さい。
http://lx.wakhok.ac.jp/cgi-bin/cgi.arg3/?abc+xyz http://lx.wakhok.ac.jp/cgi-bin/cgi.arg3/home.html?abc+xyz+123 http://lx.wakhok.ac.jp/cgi-bin/cgi.arg3/dir1/dir2/dir3 http://lx.wakhok.ac.jp/cgi-bin/cgi.arg3/~<user>/home.html http://lx.wakhok.ac.jp/cgi-bin/cgi.arg3/~<user>?123+abcd+efg+h%22j http://lx.wakhok.ac.jp/cgi-bin/cgi.arg3/a=b&c=123/d="xyz" http://lx.wakhok.ac.jp/cgi-bin/cgi.arg3/a=b&c=123/d="xyz"?1+2+3+4+5
分かったでしょうか?
PATH_INFOには、プログラム名以下、記号'?'が現れるまでのの文字列が、
そのまま入れられていることが分かったと思います。その名に反して、
パス名以外の情報もここには置けるわけです。とはいっても、パス名を
置くのが、一般的な使い方になると思います。
上のいくつかのケースでは、PATH_TRANSLATEDが空のままであることにも、
気が付いたと思います。
PATH_TRANSLATEDには、PATH_INFOがバーチャルなURLパス名として、指定子Passで
与えられたルールで、UNIX上のファイル名として解釈できるのなら、その
パス名、すなわちUNIX上の絶対パス名が入ります。
このPATH_INFOやPATH_TRANSLATEDの機能を使わないCGIも沢山ありますが、
次にみるスクリプトUserCGIやMAPの処理では、これらは、大事な役割を
果たします。慣れないと、少し分かりにくいかもしれませんが、難しいこと
ではありませんので、納得できるまで、考えて下さい。