WebDAV(Web-based Distributed Authoring and Versioning) 一种基于 HTTP 1.1协议的通信协议。它扩展了HTTP 1.1在 GETPOSTHEAD等几个HTTP标准方法以外添加了一些新的方法,使应用程序可对Web Server直接读写,并支持写文件锁定(Locking)及解锁(Unlock),还可以支持文件的版本控制。

简单说 webdav 就像一个网盘,可以远程访问他的目录名对其文件进行读写操作。

WebDAV 允许客户端进行下列操作:

  • 处理服务器上 WebDAV 发布目录中的资源
  • 具有正确权限的用户可以在 WebDAV目录中复制和移动文件
  • 修改与某些资源相关联的属性。例如,用户可写入并检索文件的属性信息
  • 锁定并解锁资源以便多个用户可同时读取一个文件。但每次只能有一个人修改文件
  • 搜索 WebDAV 目录中的文件的内容和属性

下面介绍如何在服务器上部署 WebDAV 服务。这里通过 nginx 来代理。

编译 nginx

我们通过 nginx 来代理 webdav 服务,nginx 自带有 ngx_http_dav_module 模块,但是其不支持一些 webdav 的 method 如:PROPFIND, OPTIONS, LOCK, UNLOCK。可以通过第三方模块来完整支持 webdav 的特性。

下载以下两个第三方模块:
nginx-dav-ext-modulehttps://github.com/arut/nginx-dav-ext-module
headers-more-nginx-modulehttps://github.com/openresty/headers-more-nginx-module

以上两个模块需要在编译时通过 --add-module 参数来引入模块,同时需要包含 --with-http_dav_module 模块,否则编译会报错。

从源码编译 nginx 参考我之前的教程:https://blog.niekun.net/archives/30.html

我使用的完整的编译参数如下:

./configure --prefix=/opt/nginx-1.19.6 \
--user=nginx --group=nginx \
--with-compat --with-file-aio --with-threads \
--with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module \
--with-mail --with-mail_ssl_module \
--with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module \
--add-module=../echo-nginx-module \
--add-module=../ngx-fancyindex \
--add-module=../headers-more-nginx-module \
--add-module=../nginx-dav-ext-module

配置文件

nginx 编译安装完成后,需要配置 conf 文件来使 webdav 生效。我提前已经设置了一个单独的子域名来访问 webdav 服务,且使用 ssl 加密。

首先建立 webdav 文件夹并设置正确的权限,否则在读写时会提示权限不足:

mkdir /home/www/webdav
chown -R www-data:www-data /home/www/webdav

如果想要限制用户访问,可以使用 ngx_http_auth_basic_module 模块来建立账号访问,具体参考:https://blog.niekun.net/archives/730.html

完整配置文件如下:

dav_ext_lock_zone zone=foo:10m;
server {
    listen        443 ssl http2;
    listen        [::]:443 ssl http2;
    server_name   webdav.xxx.xxx;
    include       my-server/ssl;

    # 限制访问
    auth_basic           "Restricted Access";
    auth_basic_user_file ../users/.adminpasswd;

    # webdav 目录
    root /home/www/webdav;
    client_body_temp_path /opt/nginx/client_body_temp;

    # webdav 设置
    dav_access      user:rw  group:rw  all:r;
    dav_methods PUT DELETE MKCOL COPY MOVE;
    dav_ext_methods PROPFIND OPTIONS LOCK UNLOCK;
    dav_ext_lock zone=foo;
    create_full_put_path on;

    # 优化大文件上传
    send_timeout 3600;
    client_body_timeout 3600;
    keepalive_timeout 3600;
    lingering_timeout 3600;
    client_max_body_size 2G;

    location / {
        # 创建文件夹操作时结尾添加斜杠
        if ($request_method = MKCOL) {
            rewrite ^(.*[^/])$ $1/ break;
        }

        # 移动文件夹操作时结尾添加斜杠
        if (-d $request_filename) {
            rewrite ^(.*[^/])$ $1/;
            set $md /;
        }

        set $x $http_destination$request_method;
        if ($x ~ [^/]MOVE) {
            more_set_input_headers -r "Destination: ${http_destination}${md}";
        }
    }

    # 拒绝 Windows 或 macos 多余文件上传到 webdav 路径
    location ~ \.(_.*|DS_Store|Spotlight-V100|TemporaryItems|Trashes|hidden|localized)$ {
        access_log  off;
        error_log   off;

        if ($request_method = PUT) {
            return 403;
        }
        return 404;
    }

    location ~ \.metadata_never_index$ {
        return 200 "Don't index this drive, Finder!";
    }
}

注意第一句 dav_ext_lock_zone 要放在 http 块内。否则会报错。

配置文件修改好后,使用下面指令测试配置是否正确:

nginx -t

如果返回 ok 重启服务即可:

systemctl restart nginx

客户端连接

nginx 配置好 webdav 模块并启动后,可以尝试在客户端访问。

Windows 的 file explorer 和 macos 的 finder 都可以直接连接 webdav。

Windows 端

在 file explorer 中点击 home - easy access - map as drive:
1.jpg

在弹出窗口中点击 connect to a web site:
2.jpg

点击 next 在地址栏输入服务器 nginx 定义的 webdav 访问地址:
3.jpg

点击 next 后如果设置了 auth_basic 会提示要求输入账户和密码,输入账户密码后就进入了 webdav 目录了,下面就可以测试新建文件,修改文件等操作。

注意 Windows 中默认只有 https 方式访问的地址才可以设置 auth,否则不会弹出输入账户和密码的提示框,而是直接提示无法访问此地址。如果想要开放 http 方式的 auth 验证,需要修改注册表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters\BasicAuthLevel 的值为 2,然后重启系统即可,此键值定义为:

  • 0 - Basic authentication disabled
  • 1 - Basic authentication enabled for SSL shares only
  • 2 or greater - Basic authentication enabled for SSL shares and for non-SSL shares

macos 端

参考链接:

Making Native WebDAV Actually Work on nginx with Finder and Explorer
Nginx repair of WebDAV functionality
Module ngx_http_dav_module
Using Basic Authentication with Windows 7 and Windows Vista WebDAV Client

标签:无

你的评论