以下の設定では、GET、PUT、MKCOL などは正常に動作しますが、MOVE と COPY は動作しません。
server {
listen 80 ;
listen [::]:80 ;
server_name _;
root /var/www/html;
charset utf-8;
error_log /var/log/nginx/error.log debug;
rewrite_log on;
auth_pam "WebDav auth";
auth_pam_service_name "nginx";
location /dav/ {
autoindex on;
client_body_temp_path /var/www/tmp;
rewrite ^/dav/(.*)$ /dav/$remote_user/$1 break;
dav_methods PUT DELETE MKCOL COPY MOVE;
dav_ext_methods PROPFIND OPTIONS;
dav_access user:rw group:rw all:r;
create_full_put_path on;
}
}
デバッグ ログには、「http copy to」が書き換えられなかったため、開くことができず、500 エラーが返されたことが示されています。宛先の http リクエスト ヘッダーを書き換えて、次のように試す必要があると思います。
set $destination $http_destination;
if ($destination ~ ^(http://www.foobar.test/dav)/(.*)$) {
set $destination $1/$remote_user/$2;
set $http_destination $destination;
}
しかし、これも動作しません。WebDav を rewrite ディレクティブで動作させる方法を教えてください。
答え1
騒音で申し訳ありません。ヘッダー-more-nginx-モジュール全体のシンプルな構成は次のとおりです。
server {
listen 80 ;
listen [::]:80 ;
server_name _;
root /var/www/html;
charset utf-8;
auth_pam "WebDav auth";
auth_pam_service_name "nginx";
location /dav/ {
set $destination $http_destination;
if ($destination ~ ^(http://www.foobar.test/dav)/(.*)$) {
set $destination $1/$remote_user/$2;
more_set_input_headers "Destination: $destination";
}
rewrite ^/dav/(.*)$ /dav/$remote_user/$1 break;
dav_methods PUT DELETE MKCOL COPY MOVE;
dav_ext_methods PROPFIND OPTIONS;
dav_access user:rw group:rw all:r;
create_full_put_path on;
}
}
答え2
ありがとうございます。http 経由で WebDAV を実行しているバックエンド IIS サーバーへの https プロキシとして NGINX を使用したときに、同様の問題が発生しました。
渡されていたMOVEリクエストの宛先ヘッダーはhttps://アドレスでしたが、http経由で実行されていたため、バックエンドサーバーから400エラーを受信していました。宛先ヘッダーをhttps://からhttp://に変更する必要があったため、次のコードを使用しました。
set $destination $http_destination;
if ($destination ~ ^(https://webdav.mydomain.com)/(.*)$) {
set $destination "http://webdav.mydomain.com/$2";
more_set_input_headers "Destination: $destination";
}
これにより、MOVEリクエストが成功しました