Nginx で WebDav http 宛先リクエスト ヘッダーを書き換える方法

Nginx で WebDav http 宛先リクエスト ヘッダーを書き換える方法

以下の設定では、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リクエストが成功しました

関連情報