WebDAV

出自 ArchWiki

WebDAV (Web Distributed Authoring and Versioning) 是 HTTP/1.1 的扩展,因此可以被认为是一种协议。它包含了一系列概念和相关的扩展方法,允许通过 HTTP/1.1 协议进行读写操作。WebDAV 提供了通过 HTTP 进行文件传输的方式,而不是使用 NFSSMB

本文的目标是使用 web 服务器 设置一个简单的 WebDAV 配置。

服务器

Apache

安装 Apache HTTP 服务器

取消注释 DAV 和 auth_digest 模块。

LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so
LoadModule dav_lock_module modules/mod_dav_lock.so
LoadModule auth_digest_module modules/mod_auth_digest.so

取消注释 conf/extra/httpd-dav.conf 的 include 行。

# Distributed authoring and versioning (WebDAV)
Include conf/extra/httpd-dav.conf

检查 /etc/httpd/conf/extra/httpd-dav.conf 中的以下行

DAVLockDB /etc/httpd/var/DavLock

确保将其添加到任何其他指令之外,例如在 DocumentRoot 定义的正下方。

如果您想要一个干净的设置,请考虑使用 /srv/dav 结构而不是 /etc/httpd/uploads,但这是我在默认情况下找到的。

接下来,检查 /etc/httpd/conf/extra/httpd-dav.conf 中的别名(也在任何指令之外)

DavLockDB "/etc/httpd/var/DavLock"

Alias /uploads "/etc/httpd/uploads"

<Directory "/etc/httpd/uploads">
    Dav On

    AuthType Digest
    AuthName DAV-upload
    # You can use the htdigest program to create the password database:
    #   htdigest -c "/etc/httpd/user.passwd" DAV-upload admin
    AuthUserFile "/etc/httpd/user.passwd"
    AuthDigestProvider file

    # Allow universal read-access, but writes are restricted
    # to the admin user.
    <RequireAny>
        # require that these methods are used (PROPFIND allows directory listing) ...
        Require method GET POST OPTIONS PROPFIND
        # or that the user is admin (f.e. PUT is required to write a file, MKCOL for folders)
        Require user admin
        
        # -- Notes ---
        # more info on methods in the webdav rfc: http://www.webdav.org/specs/rfc4918.html
        # POST treated as PUT: https://datatracker.ietf.org/doc/html/rfc5995
       
        
    </RequireAny>
</Directory>

创建目录

# mkdir -p /etc/httpd/var

检查 DavLockDB 目录的权限,并确保 web 服务器 用户 http 具有写入权限

# chown -R http:http /etc/httpd/var
# mkdir -p /etc/httpd/uploads
# chown -R http:http /etc/httpd/uploads

nginx

安装 nginx-mainline (nginx 的主线变体) 和 nginx-mainline-mod-dav-extAUR

/etc/nginx/nginx.conf 的顶部,任何块之外,添加

load_module /usr/lib/nginx/modules/ngx_http_dav_ext_module.so;

为 WebDAV 向您的 server 块添加一个新的 location,例如

location /dav {
    root   /srv/http;

    dav_methods PUT DELETE MKCOL COPY MOVE;
    dav_ext_methods PROPFIND OPTIONS;

    # Adjust as desired:
    dav_access user:rw group:rw all:r;
    client_max_body_size 0;
    create_full_put_path on;
    client_body_temp_path /srv/client-temp;
    autoindex on;

    allow 192.168.178.0/24;
    deny all;
}

上面的示例要求目录 /srv/http/dav/srv/client-temp 存在。

您可能希望使用绑定挂载来使其他目录可以通过 WebDAV 访问。

rclone

安装 rclone 软件包。它支持 使用 webdav 导出远程或本地目录。

要提供 /srv/http 的内容,无需身份验证

$ rclone serve webdav /srv/http

Caddy

安装 caddy-webdav-gitAUR 软件包,或者使用 xcaddy-binAUR 并使用 WebDAV 模块构建 Caddy

$ xcaddy build --with github.com/mholt/caddy-webdav

要在路径 dav 上使用端口 80 提供 /srv/webdav 的内容,请将以下内容添加到您的 Caddyfile

:80 {
    rewrite /dav /dav/
    webdav /dav/* {
       root /srv/webdav
       prefix /dav
    }
    file_server
}

然后 运行 Caddy

$ caddy run

客户端

Cadaver

安装 cadaver 软件包。

安装完成后,测试 WebDAV 服务器

$ cadaver https://127.0.0.1/dav
dav:/dav/> mkcol test
Creating `test': succeeded.
dav:/dav/> ls
Listing collection `/dav/': succeeded.
Coll: test

Dolphin

要在 Dolphin 中创建一个永久的 WebDAV 文件夹,请在位置侧边栏的网络部分选择网络,然后按下添加网络文件夹按钮。将出现网络文件夹向导。选择WebFolder (webdav),并填写后续表单。

或者,只需单击路径栏,然后使用 webdav:// 协议说明符输入 url。

Nautilus

安装 gvfsgvfs-dnssd 软件包。

Nautilus 中选择 “连接到服务器”,然后输入以 dav://davs:// 协议指定的地址

dav://127.0.0.1/dav
注意: 如果您使用 dav:// 收到 “HTTP Error: Moved permanently” 错误,请尝试使用 davs:// 作为协议。

rclone

rclone 是一个命令行工具,可让您同步到/从远程文件系统,或者 挂载 (具有许多缓存选项),包括 WebDAV。

Thunar

安装 gvfsgvfs-dnssd 软件包。

Thunar 中,按 Ctrl+l 并输入以 davdavs 协议指定的地址

davs://webdav.yandex.ru

身份验证

您可以使用的身份验证协议有很多种

  • plain
  • digest
  • 其他

Apache

使用 htdigest(1) (如果文件已存在,请删除 -c 选项)

# htdigest -c /etc/httpd/conf/passwd WebDAV username
注意: 确保 httpd.conf 中通过以下条目启用了摘要式身份验证: LoadModule auth_digest_module modules/mod_auth_digest.so

使用 plain htpasswd(1) (如果文件已存在,请删除 -c 选项)

# htpasswd -c /etc/httpd/conf/passwd username

接下来,必须编辑 httpd.conf 以启用身份验证。一种方法是要求用户 foo 访问所有内容

<Directory "/home/httpd/html/dav">
  DAV On
  AllowOverride None
  Options Indexes FollowSymLinks
  AuthType Digest # substitute "Basic" for "Digest" if you used htpasswd above
  AuthName "WebDAV"
  AuthUserFile /etc/httpd/conf/passwd
  Require user foo
</Directory>
注意: AuthName 必须与使用 htdigest 命令进行摘要式身份验证时传递的 realm 名称匹配。对于基本/plain 身份验证,可以删除此行。此外,请确保 AuthUserFile 路径与上面 htdigesthtpasswd 命令中使用的路径匹配。

如果您想允许所有人读取,可以在您的 httpd.conf 中使用此配置

<Directory "/home/httpd/html/dav">
  DAV On
  AllowOverride None
  Options Indexes FollowSymLinks
  AuthType Digest # substitute "Basic" for "Digest" if you used htpasswd above
  AuthName "WebDAV"
  AuthUserFile /etc/httpd/conf/passwd
  Require all granted
  <LimitExcept GET HEAD OPTIONS PROPFIND>
    Require user foo
  </LimitExcept>
</Directory>

不要忘记在进行更改后 重启 httpd.service

注意: 如果您在使用 Apache 时收到 405 错误,请将 DirectoryIndex disabled 添加到您的 Directory 部分。

故障排除

某些文件管理器无法在 nginx WebDAV 中编辑目录

nginx WebDAV 要求目录路径以斜杠 (/) 结尾,但某些文件管理器不会在路径末尾附加 /

这可以通过以下两种方式解决:要么删除相应的检查 代码 并重新编译它,要么在 nginx server 块中添加以下代码以在需要时在请求末尾添加 /

# The configuration was based on: https://nworm.icu/post/nginx-webdav-dolphin-deken/
# if the request method is MKCOL or is to a directory, add / at the end of the request if it was missing 
if ($request_method = MKCOL) {
    rewrite ^(.*[^/])$ $1/ break; 
}
if (-d $request_filename) { 
    rewrite ^(.*[^/])$ $1/ break; 
}

# if the request method is copy or move a directory, add / at the end of the request if it was missing
set $is_copy_or_move 0;
set $is_dir 0;
if (-d $request_filename) { 
    set $is_dir 1; 
}
if ($request_method = COPY) {
    set $is_copy_or_move 1;
}
if ($request_method = MOVE) {
    set $is_copy_or_move 1;
}
set $is_rewrite "${is_dir}${is_copy_or_move}";
if ($is_rewrite = 11) {
    rewrite ^(.*[^/])$ $1/ break;
}