У меня есть веб-сайт, на котором определенный раздел использует методы WebDAV (в частности, HTTP-удаление) для удаления файлов. Настроить это довольно просто:
location /files/docs {
auth_basic Restricted;
auth_basic_user_file /etc/nginx/htpasswd;
dav_methods DELETE;
}
Это работает достаточно хорошо. Однако некоторые из моих пользователей используют несовместимый клиент WebDAV, который удаляет каталоги, отправляя DELETE /files/docs/some/folder
, вместо DELETE /files/docs/some/folder/
согласно спец. (Обратите внимание на конечный /
). Оставляя позади /
приводит к ответу сервера «409 Conflict». Таким образом, я должен переписать такие запросы к каталогам, чтобы добавить конечный /
.
Эта статья решает проблему, но предложенное решение не работает. Мои новые правила следующие:
location /files/docs {
if (-d $request_filename) {
rewrite ^(.*[^/])$ $1/ break;
}
alias /srv/www/docs;
auth_basic Restricted;
auth_basic_user_file /etc/nginx/htpasswd;
dav_methods DELETE;
}
Однако всякий раз, когда делается запрос DELETE, он выдает ошибку:
*1 "alias" cannot be used in location "/files/docs" where URI was rewritten, client: (client IP), server: (server IP), request: "DELETE /files/docs/some/folder HTTP/2.0", host: (server IP)", referrer: "(referer)"
Как мне обойти эту проблему?
В вашем случае использование псевдонима не рекомендуется (http://nginx.org/en/docs/http/ngx_http_core_module.html#alias). Вместо этого вы можете сделать что-то подобное, используя перезапись и root:
location /files/docs {
rewrite ^/files/(docs.*)$ /$1 last;
}
location /docs {
if (-d $request_filename) { rewrite ^(.*[^/])$ $1/ break; }
root /srv/www;
dav_methods DELETE;
}
Это сначала обрабатывает структуру папок (удаляя ненужную часть URL / пути), а затем решает дилемму конечной косой черты. Что мне подходит:
[22/Feb/2018:01:45:09 +0100] "DELETE /files/docs/testfile HTTP/1.1" 204 0 "-" "Microsoft-WebDAV-MiniRedir/10.0.16299"
[22/Feb/2018:01:45:09 +0100] "DELETE /files/docs/testfolder HTTP/1.1" 204 0 "-" "Microsoft-WebDAV-MiniRedir/10.0.16299"