环境:
- Nginx 1.27.4 + 编译了 nginx-dav-ext-module 第三方扩展模块(GitHub)
- Win 10 22H2 内置 webdav 客户端(UA:Microsoft-WebDAV-MiniRedir/10.0.19044)
- Win 11 24H2 内置 webdav 客户端(UA:Microsoft-WebDAV-MiniRedir/10.0.26100)
- 使用了 HTTPS,这年头公网访问不会还在用 http?
nginx-dav-ext-module:
https://github.com/arut/nginx-dav-ext-module
Webdav 服务端配置
location ^~ /114514 {
proxy_hide_header Content-Disposition;
# 防止被解析
if ($request_filename ~* ^.*?\.(php|doc|pdf|rar|gz|zip|docx|exe|xlsx|ppt|pptx)$){
add_header Content-Disposition: 'attachment;';
}
types { }
default_type application/octet-stream;
#default_type text/html;
alias /opt/nginx/vhost/114514;
# 目录列表顺序必须在 alias 下面
autoindex on;
autoindex_localtime on;
# 是否按字节大小显示,关闭则按B KB MB GB显示
autoindex_exact_size off;
# 显示中文字符
charset utf-8;
auth_basic on;
auth_basic_user_file /opt/nginx/httppasswd/passwd;
## webdav config
dav_methods PUT DELETE MKCOL COPY MOVE;
dav_ext_methods PROPFIND OPTIONS;
create_full_put_path on;
dav_access user:rw group:rw all:rw;
client_body_temp_path /tmp;
}
先通过其他方式自查服务端的 Webdav 是正常工作的,仅仅是在 Windows 下异常
通过 Windows 资源管理器图形化界面方式选择 映射网络驱动器 或 连接到可用于存储文档和图片的网站 都无法挂载,且尝试了使用其他凭据连接也无法挂载
检查 Nginx 服务端日志输出:
192.0.2.1 - ["2025-06-30 17:13:09"] "OPTIONS /114514 HTTP/2.0" 204 0 "-" "Microsoft-WebDAV-MiniRedir/10.0.26100"
192.0.2.1 - ["2025-06-30 17:13:09"] "PROPFIND /114514 HTTP/2.0" 401 172 "-" "Microsoft-WebDAV-MiniRedir/10.0.26100"
192.0.2.1 - ["2025-06-30 17:13:10"] "OPTIONS / HTTP/2.0" 204 0 "-" "Microsoft-WebDAV-MiniRedir/10.0.26100"
192.0.2.1 - ["2025-06-30 17:13:10"] "PROPFIND /114514 HTTP/2.0" 401 172 "-" "Microsoft-WebDAV-MiniRedir/10.0.26100"
明面看是 Windows 没有正确传递(如果不是你输错密码或用户名) HTTP 基本认证的相关 Header 给 Nginx 服务端,所以一直返回 401 状态码,然后尝试了使用其他凭据也不行,但是细想 HTTP基本认证(Basic Authentication) 是 RFC 7617 标准的一部分,必须无条件支持,所以又是什么地方的奇奇怪怪 BUG 发作了
然后使用 浏览器无痕模式 / Ctrl + Shift + Del 清除所有浏览器缓存数据重新打开浏览器 等方法排除了 Windows 错误的缓存了凭据,也是不行,那极大概率是 Windows 抽风了
改用 Windows 命令行挂载,直接一步成功
net use * https://114514.example.org/webdav /user:114514 Password1919810
根据个人情况自行修改
Windows 自带 Webdav 客户端的可选优化参数
指定 WebClient 服务在发出请求(例如 “GET /file.ext” 或 “PUT /file.ext”)后使用的 WebDAV 超时时间(以秒为单位),默认值 60 秒
reg add "HKLM\SYSTEM\CurrentControlSet\Services\WebClient\Parameters" /v SendReceiveTimeoutInSec /t REG_DWORD /d 300 /f
修改大文件传输上限从默认的 50 MiB 到最大值 4 GiB
reg add "HKLM\SYSTEM\CurrentControlSet\Services\WebClient\Parameters" /v FileSizeLimitInBytes /t REG_DWORD /d 4294967295 /f
让 Webdav 允许在 http / https 的网站都启用基本身份验证,默认值为 1 ,仅对 Https 网站启用基本身份验证
reg add "HKLM\SYSTEM\CurrentControlSet\Services\WebClient\Parameters" /v BasicAuthLevel /t REG_DWORD /d 2 /f
修改 Windows Webdav 客户端允许目录列表返回数据的最大大小
reg add "HKLM\SYSTEM\CurrentControlSet\Services\WebClient\Parameters" /v FileAttributesLimitInBytes /t REG_DWORD /d 4294967295 /f
说明:用于控制 Windows WebDAV 客户端(WebClient 服务)在列举一个文件夹时所能接收的所有文件属性(包括 PROPFIND 返回的 XML 中 metadata)的最大总字节数,默认值为 1 000 000(约 1 MiB),影响可列举的文件/子文件夹数量,当网络驱动器下目录包含大量内容时(例如好几万的文件/目录),需要增加该值大小,不然这些属性总大小超过该值,WebClient 会截断或拒绝整个目录的枚举,导致无法访问
指定 WebClient 服务与非本地 WebDAV 服务器通信时使用的连接超时时间,单位:秒,默认值 30 秒
reg add "HKLM\SYSTEM\CurrentControlSet\Services\WebClient\Parameters" /v InternetServerTimeoutInSec /t REG_DWORD /d 300 /f
禁止缓存非 Webdav 错误的状态码,实时请求服务器,避免缓存错误码导致重试时直接返回错误,而不是实际请求服务器返回响应,默认值 60 秒
reg add "HKLM\SYSTEM\CurrentControlSet\Services\WebClient\Parameters" /v ServerNotFoundCacheLifeTimeInSe /t REG_DWORD /d 0 /f
禁止启用 WebDAV 文件锁定协议支持(LOCK/UNLOCK 方法),因为 Windows 客户端实现有缺陷
reg add "HKLM\SYSTEM\CurrentControlSet\Services\WebClient\Parameters" /v SupportLocking /t REG_DWORD /d 0 /f
指定 WebClient 服务与本地 WebDAV 服务器通信时使用的连接超时,默认值 15 秒
reg add "HKLM\SYSTEM\CurrentControlSet\Services\WebClient\Parameters" /v LocalServerTimeoutInSec /t REG_DWORD /d 15 /f
鸣谢:
https://learn.microsoft.com/zh-cn/iis/publish/using-webdav/using-the-webdav-redirector