开启Apache2的WebDAV

  1. 首先需要关闭apache2的directory listing功能,一般写在配置文件/etc/apache2/apache2.conf中:
    1
    2
    3
    4
    5
    <Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
    </Directory>
    去掉Indexes,改为:
    1
    2
    3
    4
    5
    <Directory /var/www/>
    Options FollowSymLinks
    AllowOverride None
    Require all granted
    </Directory>
  2. 开启WebDAV相关的模块:sudo a2enmod dav dav_fs auth_digest
  3. 指定一个WebDAV目录,如/var/www/webdav,我喜欢直接访问html root,所以用的是一个symbol link:ln -s /var/www/webdav /var/www/html(这个叫啥来着……WebDAV alongside HTTP service?)
  4. 指定一个存放WebDAV权限数据的目录,如/var/www/webdav-config,直接mkdir新建一个就行
  5. 将上面两步的目录owner改成www-data:www-data
  6. 更改网站的配置文件:/etc/apache2/sites-enabled/default-ssl.conf,添加WebDAV相关的配置:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Alias /webdav /var/www/webdav  # 将WebDAV路径映射到/webdav下
    DavLockDB /tmp/apache2-davlock # 随便放,用之前那个webdav-config也行
    <Directory /var/www/webdav>
    DirectoryIndex disabled # 强制关闭directory listing(确保在step 1没配置的情况下还能用)
    DAV On
    AuthType Digest
    AuthName "webdav" # 指定的realm
    AuthUserFile /var/www/webdav-config/passwd
    Require valid-user
    </Directory>
  7. 创建用户验证文件:touch /var/www/webdav-config/passwd && chown www-data:www-data /var/www/webdav-config/passwd
  8. 添加WebDAV用户:htdigest [auth_file] [realm_name] [user_name],如htdigest /var/www/webdav-config/passwd webdav user将名为user的用户添加到webdav realm中
  9. 重启apache2

然后就可以在linux和windows挂载WebDAV分区了,Windows可以通过命令行添加:net use Z: \\[your_host]@SSL\webdav,或者直接在文件浏览器上面的“映射网络驱动器”添加。

这样,HTTP请求到/webdav目录时是需要身份验证的,而默认的HTTP请求(除了/webdav以外的URL)不需要认证直接访问。

7/8更新:多个WebDAV目录的配置

有时候,有些文件只是想单纯用服务器存着,方便跨设备浏览,但不想暴露到无认证的HTTP服务中。

有两种配置方式。一种是直接在apache2配置文件上直接添加第二个Directory,开启DAV(重复上述第6步的步骤);另外一种是用mount --bind挂载其他文件夹到当前WebDAV文件夹下的子文件夹中,比如cd /var/www/webdav && mkdir html && mount --bind /var/www/html /var/www/webdav/html(更常见的是写到/etc/fstab中进行开机挂载:/var/www/html /var/www/webdav/html none bind),则将HTTP根目录挂载到WebDAV的html子文件夹中,只有该文件夹里面的内容是可以通过非WebDAV协议的一般HTTP请求获得的,其他内容则都需要登录才能访问。