■UserDirを使用している環境で、ドキュメントルート以外に作成したCGI用ディレクトリでCGIを動作させたい。

[概 要]

Apacheで、UserDirを使用している環境で、セキュリティ上、ドキュメントルート以外に作成したCGI用ディレクトリでCGIを動作させたい。

[対 策]

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 を使用すると正規表現によりユーザ名でマッチングをとり、対応付けすることが可能となる。

  1. 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_-]+) の[・・・・]の部分を書き換えば良い。

  2. 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>



Top Pageへ     戻る