Назад | Перейти на главную страницу

Переписать запросы на удаление WebDAV, если это каталог

У меня есть веб-сайт, на котором определенный раздел использует методы 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"