■WebDAVでCGIやPHPといったダイナミックなリソースをコピーできない。

[原 因]

WebDAVは、HTTPベースのファイル共有システムのため、例えばCGIをコピーしようとするとスクリプトとして実行してしまい、結果的にエラーとなってしまう。

[対 策]

対策としては原因の裏返しになるが、WebDAVでアクセスしたときにスクリプトを実行しないよう、テキストとして扱うようにすればアクセスが可能になる。
一般的に、デフォルトで存在するcgi-binディレクトリ以外でCGIを実行できるようにする場合、おやじもそうであるがは"AddHandler cgi-script .cgi"でサーバ全体でCGIを実行できるようにすることが多い。実は、これがWebDAVでCGIを扱えなくしている原因になっている。実は、AddHandlerディレクティブは上書きできないためAddHandlerディレクティブでCGIを実行可能にしてしまうと、ForceTypeディレクティブを使用したWebDAV用の対処(スクリプトをテキスト扱いすること)ができなくなってができなってしまうという問題が発生する。
従って、対策の第一歩としては、AddHandlerディレクティブを使用しない他の方法でCGIを利用可能にする必要がある。具体的には、ScriptAliasやScriptAliasMatchを使用してCGIを設置するディレクトリを集約し、そこでCGIを実行させるようにすればよい。その上で、WebDAVでそのディレクトリにアクセスするとき(通常アクセスとはAliasで異なるURIでアクセスさせる)にForceTypeディレクティブを使用して、全てテキストとして扱うように設定すればCGIをコピーできるようになる。 設定例を以下に示す。

  1. Apache標準のcgi-binディレクトリでCGIを動かす場合

    ScriptAliasを使用して、Apache標準のcgi-binディレクトリでWebDAVでCGIを扱えるようにする設定例を以下に示す。この場合、cgiとしてアクセスする場合は、http://www.aconus.com/cgi-bin/ となり、WebDAVでアクセスする場合は、http://www.aconus.com/webdav_cgi-bin/ となる。
    "ForceType text/plain"で、この<Location>セクション内は全てtextとして扱うように指定する。

    ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"

    Alias /webdav_cgi-bin "/usr/local/apache2/cgi-bin"
    DavLockDB /var/lock/dav/DavLock
    <IfModule mod_dav.c>
        DAVMinTimeout 600
        <Location /webdav_cgi-bin>
            DAV On
            ForceType text/plain
        </Location>
    </IfModule>

  2. ホームディレクトリ配下のCGI用ディレクトリ(cgi-bin)でCGIを動かす場合

    ユーザ毎にcgi-binディレクトリを以下のようなディレクトリ構造で設置するする場合の設定例を示す。

    [ディレクトリ構造]
    
      /home--+--user1--+--public_html
             |         |
             |         +--cgi-bin
             |
             +--user2--+--public_html
                       |
                       +--cgi-bin
    このようなCGIアクセスはScriptAliasMatchを使用すれば可能となるが、同じcgi-binディレクトリでWebDAVでCGIを扱えるようにする設定例を以下に示す。
    設定としては、標準の"ScriptAlias"行をコメントアウトし、"ScriptAliasMatch"を使用して正規表現でマッチングをとってターゲットのファイルにマッピングするが、WebDAVもこれと同様に、"AliasMatch"、"LocationMatch"を使用して設定する。
    この場合、cgiとしてアクセスする場合は、http://www.aconus.com/~oyaji/cgi-bin/ となり、WebDAVでアクセスする場合は、http://www.aconus.com/~oyaji/webdav_cgi-bin/ となる。

    #ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"

    ScriptAliasMatch ^/~([a-zA-Z0-9_-]+)/cgi-bin(.*) /home/$1/cgi-bin$2

    AliasMatch ^/~([a-zA-Z0-9_-]+)/webdav_cgi-bin(.*) "/home/$1/cgi-bin$2"
    DavLockDB /var/lock/dav/DavLock
    <IfModule mod_dav.c>
        DAVMinTimeout 600
        <LocationMatch ^/~([a-zA-Z0-9_-]+)/webdav_cgi-bin>
            DAV On
            ForceType text/plain
        </LocationMatch>
    </IfModule>

なお、PHPも同様の方法で対処可能であり、スクリプトとしてアクセスするのとは別にAlias(Match)やLocation(Match)を使用してWebDAV専用のURIを定義し、そこでは、"ForceType text/plain"で全てtextとして扱うように指定すればよい。



Top Pageへ     戻る