С приведенными ниже конфигурациями 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
Извините за шум. Самостоятельно решено с помощьюзаголовки-больше-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
Спасибо за это. У меня была похожая проблема при использовании NGINX в качестве https-прокси для внутреннего сервера IIS, работающего через WebDAV через http.
Заголовок назначения в передаваемом запросе MOVE был адресом https://, но я получал ошибку 400 от внутреннего сервера, так как он работал по http. Мне нужно было изменить заголовок назначения с 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.