Apacheで、 http://www.aconus.com/~oyaji/index.html のようにUserDirを使用してアクセスさせる場合、UserDirの指定が優先されるため、 ScriptAliasでCGI用のディレクトリを指定していても、そのディレクトリにはアクセスできない。 例えば、
UserDir /home/*/public_html
ScriptAlias /cgi-bin/ /usr/local/apache2/cgi-bin/
として、 http://www.aconus.com/~oyaji/cgi-bin/aaa.cgi で /usr/local/apache2/cgi-bin/aaa.cgi をアクセスさせようとしても、実際には
/home/oyaji/public_html/cgi-bin/aaa.cgi にアクセスにいって、結果として404エラーになってしまう。
また、ScriptAliasでは、ユーザ毎にCGI用ディレクトリをドキュメントルート以外に作成できない。
これらの問題を解決するのが、 ScriptAliasMatch ディレクティブである。ScriptAliasMatch を使用すると正規表現によりユーザ名でマッチングをとり、対応付けすることが可能となる。
- http://www.aconus.com/~oyaji/cgi-bin/aaa.cgi でシステム共通のCGI用ディレクトリ配下にアクセスさせる方法
/usr/local/apache2/cgi-binディレクトリ配下でCGIを動作させる場合、以下の設定をhttpd.confに追加するだけで、動作可能になる。
ScriptAliasMatch ^/~([a-zA-Z0-9_-]+)/cgi-bin(.*) /usr/local/apache2/cgi-bin$2
なお、あまり薦められないが、ここにあげた内容では、ユーザ名には英数字と「_」、「-」が使用できるが、他の文字がどうしても必要な場合は、正規表現に従って、([a-zA-Z0-9_-]+) の[・・・・]の部分を書き換えば良い。
- http://www.aconus.com/~oyaji/cgi-bin/aaa.cgi でホームディレクトリ配下のCGI用ディレクトリにアクセスさせる方法
前項の場合は、CGIはシステム共通になってしまうが、こちらではユーザ毎に同じディレクトリ名ではあるがユーザ毎に設置が可能であり融通性がある。ここでは、以下のディレクトリ構造を前提に設定例を示すが、この設定でユーザからのFTPはpublic_html以下に設定すれば勝手にCGIを設置できないため、セキュリティを確保可能となる。
[ディレクトリ構造]
/home--+--user1--+--public_html
| |
| +--cgi-bin
|
+--user2--+--public_html
|
+--cgi-bin
|
以下の設定をhttpd.confに追加するだけで、ユーザ毎にCGI用ディレクトリでCGIが動作可能になる。
ScriptAliasMatch ^/~([a-zA-Z0-9_-]+)/cgi-bin(.*) /home/$1/cgi-bin$2
ユーザ名の扱いについては、こちらも前項で同様である。
なお、いずれの場合もCGIにhtmlや画像ファイル(例えばgif)がある場合は、Directoryディレクティブに以下も合わせて記述すること。この設定をしないと、htmlや画像ファイルも全てcgiとしてれば実行されてしまい、500エラーになってしまう。(詳しくはFAQも参照のこと)
<Directory /home/*/cgi-bin/>
AddHandler text/html .html .htm
AddHandler image/gif .gif
</Directory>