next up previous contents
Next: 6.2 PATH_INFOとPATH_TRANSLATED Up: 6. CGIに引数を渡す Previous: 6. CGIに引数を渡す

6.1 QUERY_STRING

これは、URLのある種の拡張です。 httpdは、クライアントから送られてきた、こうして引数を後ろに含むように 拡張された、CGIプログラムに対応するURLを、次のように処理します。

URLを頭から解釈する過程で、"..../cgi-bin/"まで読めば、ScriptAlias指定子で 指定されたCGIディレクトリ以下のリソースだということが分かりますので、httpdは、 次のパス名 "cgi.arg1"をCGIプログラムだと考えて、UNIX上のパス名を獲得します。 これで、"..../cgi-bin/cgi.arg1" までの解釈が終わりました。 その後にまだ文字列が残っていれば、その文字列中に、記号'?'が出現するまでの 文字列を、環境変数 PATH_INFOに、記号'?'から後ろの文字列を、環境変数 QUERY_STRINGに設定します。

サーバhttpdは、前に得たCGIプログラムの絶対パス名を用いて、このプログラム を起動(execve)しようとします。この時、QUERY_STRING中の記号'?'は、 スペースに変換され、引数として切り出され起動プログラムに渡されます。 こうして、結果的には、Gateway プログラムに引数を与えることが可能となります。

次のスクリプトcgi.arg2は、環境変数QUERY_STRINGの値を表示すると共に、 引数の数とその値を表示するスクリプトです。 呼び出すURLの最後の'?'以下を様々に変えて、試してみて下さい。

 
#!/bin/ksh
echo Content-type: text/html
echo
echo "<H1>"
echo "環境変数 QUERY_STRING = \'$QUERY_STRING\'"
echo "</H1>"
echo "<HR>"
echo "<H2>"
echo "引数の数 $#"
echo "</H2>"
echo "<HR>"
n=1
for arg
 do
    echo "第${n}引数:  $arg"
    echo "<P>"
   (( n = n+1 ))
 done

もしも、引数の中に、先のURL拡張のルールの中では特別の意味を持っている '?'や'+'を含める必要がある場合には、どうすればいいのでしょうか? そうした場合には、それらの文字コードを16進数で表し、先頭に、' 文字列の中にいれて置くと、httpdは、正しく解釈してくれます。

次に、いくつかの記号の%表記を挙げておきます。

 
' '  ===> %20  ;  '?' ===> %3f ;  '+' ===> %2b ;   '%' ===> %25
'&'  ===> %26  ;  '=' ===> %3d ;  '/' ===> %2f ;   ':' ===> %3a



Noriyo Kanayama