如果是目录,则重写 WebDAV 删除请求

如果是目录,则重写 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 冲突”。因此,我必须重写此类目录请求以添加结尾的/

本文处理了这个问题,但建议的解决方案不起作用。我的新规则如下:

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)"

我该如何解决这个问题?

答案1

在您的情况下不建议使用别名(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"

相关内容