WebDAV
WebDAV (Web Distributed Authoring and Versioning) 是 HTTP/1.1 的扩展,因此可以被认为是一种协议。它包含了一系列概念和相关的扩展方法,允许通过 HTTP/1.1 协议进行读写操作。WebDAV 提供了通过 HTTP 进行文件传输的方式,而不是使用 NFS 或 SMB。
本文的目标是使用 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
安装完成后,测试 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
安装 gvfs 和 gvfs-dnssd 软件包。
在 Nautilus 中选择 “连接到服务器”,然后输入以 dav://
或 davs://
协议指定的地址
dav://127.0.0.1/dav
dav://
收到 “HTTP Error: Moved permanently” 错误,请尝试使用 davs://
作为协议。rclone
rclone 是一个命令行工具,可让您同步到/从远程文件系统,或者 挂载 (具有许多缓存选项),包括 WebDAV。
Thunar
安装 gvfs 和 gvfs-dnssd 软件包。
在 Thunar 中,按 Ctrl+l
并输入以 dav 或 davs 协议指定的地址
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
路径与上面 htdigest
或 htpasswd
命令中使用的路径匹配。如果您想允许所有人读取,可以在您的 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
。
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; }