我有一个网站,其中某个部分使用 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"