跳转到内容

WebDAV

来自 Arch Linux 中文维基

本文或本节需要翻译。要贡献翻译,请访问简体中文翻译团队

附注: 该页面于近日同步,正在翻译中。(在 Talk:WebDAV# 中讨论)

WebDAVWeb Distributed Authoring and Versioning)是 HTTP/1.1 的扩展,因此可以作为一个协议考虑。它包含了一系列概念和由此产生的扩展方法,用以允许通过 HTTP/1.1 读写。WebDAV 不使用 NFSSMB,而是通过HTTP传输文件。

本指南目的是通过 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 文件中的行:

# 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-mainlinenginx的Mainline版本)和 nginx-mainline-mod-dav-extAUR

/etc/nginx/nginx.conf 文件的头部以及其它块的外面添加下面的行:

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

server 块中为WebDAV添加新的 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

若要使用80端口以 dav 路径提供 /srv/webdav 目录下的内容,将下面的内容添加到 Caddyfile

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

运行 Caddy

$ caddy run

Client[编辑 | 编辑源代码]

Cadaver[编辑 | 编辑源代码]

Install the cadaver package.

After installation, test the WebDAV server:

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

Dolphin[编辑 | 编辑源代码]

To create a permanent WebDAV folder in Dolphin select Network in the remotes section of the places sidebar, then press the Add Network Folder button. The network folder wizard will appear. Select WebFolder (webdav), and fill in the subsequent form.

Alternately just click the path bar and then enter the url with webdav:// protocol specifier.

Nautilus[编辑 | 编辑源代码]

Install the gvfs and gvfs-dnssd packages.

In Nautilus choose "connect to server" and enter the address with dav:// or davs:// protocol specified:

dav://127.0.0.1/dav
注意:If you get a "HTTP Error: Moved permanently" with dav://, try to use davs:// as the protocol instead.

rclone[编辑 | 编辑源代码]

rclone is a command line tool that lets you sync to/from, or mount (with many caching options), remote file systems including WebDAV.

Thunar[编辑 | 编辑源代码]

Install the gvfs and gvfs-dnssd packages.

In Thunar press Ctrl+l and enter the address with dav or davs protocol specified:

davs://webdav.yandex.ru

Authentication[编辑 | 编辑源代码]

There are numerous different protocols you can use:

  • plain
  • digest
  • others

Apache[编辑 | 编辑源代码]

Using htdigest(1) (remove the -c option if the file exists):

# htdigest -c /etc/httpd/conf/passwd WebDAV username
注意:Make sure digest authentication is enabled in httpd.conf by the presence of this entry: LoadModule auth_digest_module modules/mod_auth_digest.so

Using plain htpasswd(1) (remove the -c option if the file exists):

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

Next, httpd.conf must be edited to enable authentication. One method would be to require the user foo for everything:

<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 must match the realm name passed when using the htdigest command for digest authentication. For basic/plain authentication, this line may be removed. Also, make sure that the AuthUserFile path matches that used with the htdigest or htpasswd commands above.

If you want to permit everybody to read, you could use this in your 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>

Do not forget to restart httpd.service after making changes.

注意:If you get an 405 error with Apache, add DirectoryIndex disabled to your Directory section.

Troubleshooting[编辑 | 编辑源代码]

Some file explorers cannot edit directories in nginx WebDAV[编辑 | 编辑源代码]

nginx WebDAV requires a directory path ends with a slash (/), but some file explorers does not append a / at the end of the path.

This can be worked-around, by either removing the corresponding checking code and recompile it, or by appending the following code in a nginx server block to add / at the end of a request, if needed:

# 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;
}