Mit den folgenden Konfigurationen funktionieren GET, PUT, MKCOL und so weiter einwandfrei, MOVE und COPY jedoch nicht.
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;
}
}
Das Debug-Protokoll zeigt an, dass „http copy to“ nicht neu geschrieben wurde, es dann aber nicht geöffnet werden konnte und der Fehler 500 zurückgegeben wird. Ich glaube, ich muss den Ziel-HTTP-Anforderungsheader neu schreiben und es folgendermaßen versuchen:
set $destination $http_destination;
if ($destination ~ ^(http://www.foobar.test/dav)/(.*)$) {
set $destination $1/$remote_user/$2;
set $http_destination $destination;
}
aber es funktioniert auch nicht. Können Sie mir sagen, wie ich mit der Rewrite-Direktive mit WebDav arbeite?
Antwort1
Entschuldigen Sie den Lärm. Selbst gelöst, durch VerwendungHeader-mehr-Nginx-Modul. Die gesamte einfache Konfiguration ist:
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;
}
}
Antwort2
Vielen Dank dafür. Ich hatte ein ähnliches Problem bei der Verwendung von NGINX als https-Proxy für den Backend-IIS-Server, auf dem WebDAV über http ausgeführt wird.
Der Zielheader in der übergebenen MOVE-Anforderung war die https://-Adresse, aber ich erhielt einen 400-Fehler vom Backend-Server, da er über http lief. Ich musste den Zielheader von https:// in http:// ändern und verwendete daher Folgendes
set $destination $http_destination;
if ($destination ~ ^(https://webdav.mydomain.com)/(.*)$) {
set $destination "http://webdav.mydomain.com/$2";
more_set_input_headers "Destination: $destination";
}
Dies ermöglichte erfolgreiche MOVE-Anfragen