これは、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