Como reescrever o cabeçalho de solicitação de destino http WebDav no Nginx

Como reescrever o cabeçalho de solicitação de destino http WebDav no Nginx

Com as configurações abaixo, GET, PUT, MKCOL e outras coisas funcionam bem, mas MOVE e COPY não.

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;
    }
}

O log de depuração informa que 'http copy to' não foi reescrito e, em seguida, falhou ao abri-lo e retorna o erro 500. Acho que preciso reescrever o cabeçalho da solicitação http de destino e tentar:

set $destination $http_destination;
if ($destination ~ ^(http://www.foobar.test/dav)/(.*)$) {
    set $destination $1/$remote_user/$2;
    set $http_destination $destination;
}

mas também não funciona. Você poderia me dizer como trabalhar o WebDav com a diretiva rewrite?

Responder1

Desculpe pelo barulho. auto-resolvido, usandocabeçalhos-mais-módulo nginx. Toda a configuração simples é:

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;
    }
}

Responder2

Obrigado por isso. Tive um problema semelhante ao usar o NGINX como um proxy https para back-end do servidor IIS executando WebDAV sobre http.

O cabeçalho de destino na solicitação MOVE que estava sendo passada era o endereço https://, mas eu estava recebendo um erro 400 do servidor back-end, pois ele estava sendo executado em http. Eu precisava modificar o cabeçalho Destination de https:// para http://, então usei o seguinte

 set $destination $http_destination;
    if ($destination ~ ^(https://webdav.mydomain.com)/(.*)$) {
        set $destination "http://webdav.mydomain.com/$2";
        more_set_input_headers "Destination: $destination";
    }

Isso permitiu solicitações MOVE bem-sucedidas

informação relacionada