こないだは入れただけの状態でhttpd.confも変えずにルートを見たり、ユーザディレクトリにpublic_htmlディレクトリを作ってindex.htmlを作って見ただけだったので、今日はCGIとかやってみる。
デフォルトのCGI設定
デフォルトの状態だと/usr/pkg/libexec/cgi-binが/cgi-binとして見えるようになってるんだけど、このcgi-binディレクトリに置いてあるサンプルCGIスクリプトはどれも実行属性が付いていないのでInternal Server Errorになってしまう。てな訳で実行属性を付けてみる。
# cd /usr/pkg/libexec/cgi-bin # chmod +x printenv # chmod +x test-cgi
だけど、http://192.168.0.79/~tamura/test-cgiは動くようになるものの、printenvの方は動かない。これはtest-cgiがshのスクリプトなのに対して、printenvはPerlスクリプトでPerlのある場所の指定が/usr/local/bin/perlになってるのが原因だった。
今回はパッケージでPerlを入れてるので/usr/pkg/bin/perlにprintenvスクリプトを書き換えてもいいんだけど、Perlスクリプト入れるたびに変更するのも面倒なのでシンボリックリンクを張っておくことにする。あら、/usr/localディレクトリって最初は無いのか。
mkdir -p /usr/local/bin ln -s /usr/pkg/bin/perl /usr/local/bin/perl
この設定そのものはhttpd.confの中のScriptAliasで行われている。この場合、cgi-binディレクトリに入れておく、CGIスクリプトの拡張子は何でもいい。
# このディレクトリ中の全てのファイルを CGI プログラムであると仮定します。 ScriptAlias /cgi-bin/ "/usr/pkg/libexec/cgi-bin/"
他のディレクトリでCGIを使えるようにする
<Directory /home/*/public_html> Options All
これに加えて、httpd.confの最後の方にCGIスクリプトとして認める拡張子を指定する。Perlのために「.pl」、Rubyのために「.rb」を加えておくと吉かも知れない。
AddHandler cgi-script .cgi
SSIを使えるようにする
CGIと同じくOptionsって項目をAllにするか、Includesを追加する。
さらにSSIであることを示す拡張子を以下のように指定する。
AddType text/html .shtml AddOutputFilter INCLUDES .shtml
.htmlファイルでも実行属性を付けたらSSIになるようにしたい場合は、先ほどのOptionsの項目の下にでも「XBitHack on」の1行を追加する。(Apache 2.0では.htaccess内でAddType使って.htmlを再定義するとXBitHackが無効になるので、.htaccess内にXBitHack onを追加で記述する必要がある。)
.htaccessを使えるようにする
CGIやSSIと同じくOptionsって項目の下にでも「AllowOverride All」の1行を追加すれば、ユーザが.htaccessを適当なディレクトリに配置すれば、その中でのSSIやCGIの設定を自由に変更できる。