Cómo reescribir el encabezado de solicitud de destino http de WebDav en Nginx

Cómo reescribir el encabezado de solicitud de destino http de WebDav en Nginx

Con las configuraciones siguientes, GET, PUT, MKCOL y demás funcionan bien, pero MOVE y COPY no.

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

El registro de depuración indica que 'copia http a' no se reescribió, luego no se pudo abrir y devuelve el error 500. Creo que necesito reescribir el encabezado de la solicitud http de destino y probarlo de la siguiente manera:

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

pero tampoco funciona. ¿Podría decirme cómo funciona WebDav con la directiva de reescritura?

Respuesta1

Perdón por el ruido. auto resuelto, usandoencabezados-más-módulo-nginx. La configuración completamente simple es:

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

Respuesta2

Gracias por esto. Tuve un problema similar al usar NGINX como proxy https para el servidor IIS backend que ejecuta WebDAV a través de http.

El encabezado de destino en la solicitud MOVE que se estaba pasando era la dirección https:// pero recibí un error 400 del servidor backend ya que se estaba ejecutando a través de http. Necesitaba modificar el encabezado de Destino de https:// a http://, así que usé lo siguiente

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

Esto permitió solicitudes MOVE exitosas

información relacionada