next up previous contents
Next: この文書について... Up: 6. CGIに引数を渡す Previous: 6.1 QUERY_STRING

6.2 PATH_INFOとPATH_TRANSLATED

これまで、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の処理では、これらは、大事な役割を 果たします。慣れないと、少し分かりにくいかもしれませんが、難しいこと ではありませんので、納得できるまで、考えて下さい。


Noriyo Kanayama