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:///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; }