第4回:CGI を実行を有効にする[ ExecCGI/ScriptAlias ]
第3回では、Optionsディレクティブで、Indexes オプションの説明をしました。第4回では、Options ディレクティブ、あるいは、ScriptAlias ディレクティブを利用して、CGI の実行を有効にする方法について解説していきます。今回の主キーワードは、ExecCGI、AddHandler、ScriptAlias です。
ApacheでCGI を実行できるようにするためには、ExecCGI オプションを用います。ExecCGI オプションの前に +記号、もしくは、-記号をつけることで、有効/無効の切り替えができます。以下のように ExecCGI オプションの前に + も -記号もない場合は、CGI が有効となります。下記例の場合は、特定のディレクトリ内での CGI の実行を有効にしています。
Options ExecCGI
・・・
</Directory>
次に、AddHandler ディレクティブで CGI ハンドラと拡張子の関連付けを行います。以下の AddHandler ディレクティブの例では、 cgi または pl を拡張子に持つすべてのファイルを CGI プログラムとしてみなすことをサーバに伝えています。
■ScriptAlias ディレクトリ内に限定した CGI の利用
上述したExecCGI を用いて、ドキュメントルート内の任意のディレクトリでCGI を実行可能に設定しておく場合、セキュリティ上の問題が発生する可能性もあるため、一般的にはScriptAlias ディレクティブを使って特定のディレクトリをURLにマッピングし、その場所以外では CGIスクリプトを実行できないように設定しておきます。
ScriptAlias ディレクティブを用いれば、わざわざ Options ディレクティブで ExecCGI を指定する必要はなくなります。また、ScripAlias で指定するディレクトリは、DocumentRoot 外のディレクトリを指定するようにしましょう。以下例では、http://win.kororo.jp/cgi-bin/test.cgi が要求された場合、Apache2 は ファイル /usr/local/apache2/cgi-bin/test.cgi を実行し、その出力を返します。本来、要求されているURL とは異なる場所にあるCGI が実行されることになるわけです。
なお、Linuxユーザの場合は、ファイルのパーミッションにも注意してください。Windowsユーザの場合は、パーミッションの概念がないためそのままでも動作しますが、Linuxの場合は、パーミッションを755 や 705 などに設定しておきましょう。
■cgi-binディレクトリ内の画像が表示されない
cgi-bin ディレクトリ内にある画像ファイルはブラウザ上に表示されません。これは、Apache2 が cgi-bin ディレクトリ内のファイルを全てCGI ファイルだと認識してしまうためです。これを解決するためには、画像ファイルや CSS ファイルを cgi-bin ディレクトリ外の場所に移動させるか、もしくは、以下のようにhttpd.conf を修正し、画像ファイルと拡張子の関連付けをしてあげる必要があります。
・・・
AddHandler text/html .html
AddHandler text/css .css
AddHandler image/gif .gif
AddHandler image/jpg .jpg
AddHandler image/png .png
</Directory>
以上で、第4回は終了ですが、実際に CGI の運用を行う場合は、ここに記述された文章だけでは不十分なので、必ず以下のドキュメントを読破しておきましょう。
Apache Tutorial: CGI による動的コンテンツ