• 环境:

    • 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
最后修改:2025 年 06 月 30 日
如果觉得我的文章对你有用,请随意赞赏