WebDAVサーバとしてのApacheとnginx


Ubuntu 18.04で試しましたが、他所も同じようなもんだと思います。

Apache

導入

sudo apt install apache2

RPMとかの人もそんな感じで宜しく。

準備

ロックファイル置き場を/var/www/tempにして、/var/www/html/davを/davとして公開するものとします。

sudo mkdir -p /var/www/temp /var/www/html/dav
sudo chown www-data:www-data /var/www/temp /var/www/html/dav

設定

cd /etc/apache2/mods-enabled/
sudo ln -s ../mods-available/dav.load dav.load
sudo ln -s ../mods-available/dav_fs.load dav_fs.load 
sudo ln -s ../mods-available/dav_fs.conf dav_fs.conf

mods-availableにdav_lockというのもありますがdav_fsを使うなら必要ないそうです。
sites-available/000-default.confの最初のあたりを以下のように変更。

/etc/apache2/sites-available/000-default.conf
DavLockDB /var/www/temp/DavLockDB
<VirtualHost *:80>
        <Directory /var/www/html/dav>
                DAV On
        </Directory>

セキュリティに関しては状況に応じて宜しくとしか。
そして再起動。

sudo service apache2 restart

ところがですよ!バグがあってindex.htmlがあるディレクトリでPROPFINDが失敗します。

修正

mod_dirにバグがあるとされるので外してしまいます。

cd /etc/apache2/mods-enabled/
sudo rm dir.load
sudo rm dir.conf
sudo service apache2 restart

nginx

導入

sudo apt install nginx nginx-extras

nginxでWebDAVするのは色々面倒だと書いてあるのをどっかで読んだのですが、そうでもないです。nginx-extrasが要るだけです。

準備

sudo mkdir -p /var/www/temp /var/www/html/dav
sudo chown www-data:www-data /var/www/temp /var/www/html/dav

設定

sites-available/defaultに以下の内容を追加。

/etc/nginx/sites-available/default
  location /dav/ {
    client_body_temp_path /var/www/temp;
    dav_methods PUT DELETE MKCOL COPY MOVE;
    dav_ext_methods PROPFIND OPTIONS;
    create_full_put_path on;
    dav_access user:rw group:rw all:rw;
    autoindex on;
    allow all;
  }

例によってセキュリティは宜しく。
そして再起動。

sudo service nginx restart

試してみる

curlを使います。

sudo apt install curl

ディレクトリを作る

curl --request MKCOL http://localhost/dav/tmp/

nginxは最後のスラッシュが無いと409 Conflictって言います。なにがConflictだ?

ファイルを置く

curl --request PUT --data "hello" http://localhost/dav/hello.txt

一覧を取得する

プロパティを指定しない場合

curl --request PROPFIND --header 'Depth:1' http://localhost/dav/

デフォルトだと以下のプロパティが含まれます。

Apache nginx
creationdate
displayname
getcontentlanguage
getcontentlength(ディレクトリ)
getcontentlength(ファイル)
getcontenttype
getetag
getlastmodified
href
lockdiscovery
resourcetype(ディレクトリ)
resourcetype(ファイル)
source
status
supportedlock
executable(ディレクトリ)
executable(ファイル)

プロパティを指定する場合

例えば

curl --request PROPFIND --header 'Depth:1' --data '<D:propfind xmlns:D="DAV:"><D:prop><D:resourcetype/></D:prop></D:propfind>' http://localhost/dav/

Apacheに対して明示的にgetcontentlengthを要求するとディレクトリのstatusが404になります。