项目

通用

个人资料

操作

WebDAV

模块:mod_webdav

描述

WebDAV 模块是 RFC 4918 的实现。(自 1.4.54 版本起)

支持的方法

  • PROPFIND
  • PROPPATCH
  • OPTIONS
  • MKCOL
  • COPY
  • MOVE
  • DELETE
  • PUT
  • LOCK
  • UNLOCK

以及 HTTP/1.1 中常用的 GET, POST, HEAD。

将开放访问的 WebDAV 资源挂载到 Windows 10、Windows XP(网络位置)、Mac OS X (Finder) 和 Linux (Konqueror) 均可正常工作。挂载经过身份验证的 WebDAV 资源在 Mac OS X 和 Linux 中可正常工作。自 lighttpd 1.4.54 版本以来,litmus 测试通过。

选项

  • webdav.activate
    启用 WebDAV 功能。如果在 lighttpd.conf 的配置条件中使用,这可以是指文档根目录下的路径,例如 "/dav/" URL 映射到 "<document-root>/dav/"。注意:mod_webdav 期望独占管理文件系统中的 WebDAV 集合。如果例如在 WebDAV 根目录下的路径上使用 mod_alias,可能会出现不一致的结果。
    默认值:禁用
  • webdav.is-readonly
    仅允许对 WebDAV 资源进行读取方法(GET, PROPFIND, OPTIONS)。
    默认值:禁用(即可写)
  • webdav.sqlite-db-name
    用作数据库文件的完整路径。这是 WebDAV 属性和锁所必需的。
    默认值:(空)
  • webdav.opts(自 1.4.54 版本起)
    配置 mod_webdav 的附加选项列表。
    默认值:(空)
    webdav.opts += ("propfind-depth-infinity" => "enable")(默认值:"disable")(自 1.4.56 版本起)
    允许请求头为 "Depth: infinity" 的 PROPFIND。
    webdav.opts += ("deprecated-unsafe-partial-put" => "enable")(默认值:"disable")(自 1.4.54 版本起)
    1.4.54 版本之前的 mod_webdav 不符合 RFC 规范,并允许不安全的局部 PUT。在 lighttpd 1.4.54 中,此功能默认禁用,可以通过以下选项启用不安全行为,以提供向后兼容性。
    webdav.opts += ("unsafe-propfind-follow-symlink" => "enable")(默认值:"disable")(自 1.4.56 版本起)
    仅当同时设置了 webdav.is-readonly = "enable" 时,才指示 PROPFIND 遵循符号链接,并且结果行为和限制是可接受的。WebDAV 没有符号链接的概念。请参阅 符号链接
    webdav.opts += ("partial-put-copy-modify" => "enable")(默认值:"disable")(自 1.4.65 版本起)
    安全地实现局部 PUT 作为复制-修改-重命名序列,这在支持克隆文件扩展的现代文件系统上可能很快。
  • webdav.log-xml
    调试:将 XML 请求和响应记录到错误日志中
    默认值:禁用

示例

要为 /dav 目录启用 WebDAV,您需要将 WebDAV 选项封装在条件语句中。您必须使用如下所示的正则表达式,因为您希望匹配 /dav 目录及其下的所有内容,但不匹配例如 /davos。

  $HTTP["url"] =~ "^/dav(?:/|$)" {
    dir-listing.activate = "enable" 
    webdav.activate = "enable" 
    webdav.is-readonly = "enable" 
  }

如果您想修改文件并启用 WebDAV LOCK/UNLOCK 支持

  $HTTP["url"] =~ "^/dav(?:/|$)" {
    dir-listing.activate = "enable" 
    webdav.activate = "enable" 
    #webdav.is-readonly = "disable" # (default)
    webdav.sqlite-db-name = "/var/db/lighttpd/webdav.sqlite" 
  }

如果您想将 WebDAV 集合放在文档根目录之外

  $HTTP["url"] =~ "^/dav(?:/|$)" {
    alias.url = ("/dav" => "/path/to/dav")
    dir-listing.activate = "enable" 
    webdav.activate = "enable" 
    #webdav.is-readonly = "disable" # (default)
    webdav.sqlite-db-name = "/var/db/lighttpd/webdav.sqlite" 
  }

或者
  $HTTP["url"] =^ "/dav/" {
    alias.url = ("/dav" => "/path/to/dav")
    dir-listing.activate = "enable" 
    webdav.activate = "enable" 
    #webdav.is-readonly = "disable" # (default)
    webdav.sqlite-db-name = "/var/db/lighttpd/webdav.sqlite" 
  }
  else $HTTP["url"] == "/dav" {
    url.redirect = ("" => "/dav/")
    url.redirect-code = 308
  }

符号链接

WebDAV 资源和集合的概念与 Unix 文件系统语义并非完全一对一映射。例如,WebDAV 没有符号链接的概念。lighttpd 的 mod_webdav 将 GET、HEAD、POST 的处理委托给其他 lighttpd 模块,这些模块通常会处理符号链接。然而,像 PROPFIND 这样的 WebDAV 方法可能会拒绝指向目录的符号链接,除非同时设置了 webdav.opts = ("unsafe-propfind-follow-symlink" => "enable")webdav.is-readonly = "enable",并且由此产生的行为和限制是可接受的。(更多技术细节可在提交 6bf0b577 中找到)

当使用符号链接将不同的路径映射到 Web 服务器的单个树中时,mod_webdav 的另一种选择是使用 mod_alias 而不是符号链接,并为每个目录目标使用单独的 webdav.sqlite-db-name 数据库;即多个 WebDAV 根目录而不是单个顶层 WebDAV 根目录。mod_alias 不应 用于映射 WebDAV 树的路径,因为这可能导致不一致的结果。

在某些操作系统上,另一种选择是使用绑定挂载 (mount --bind) 将一个文件系统位置映射到另一个树下。

客户端访问

通过 TLS 访问根目录下的 WebDAV 站点 https://www.example.com/

Windows
  • 打开文件资源管理器
  • 在地址栏(快速访问)中输入 https://www.example.com/ 并按 Enter 键
  • (可选)点击“映射网络驱动器”后执行类似步骤
  • 注意:Windows webdav mini-redirector 使用神奇的路径 \\www.example.com@SSL\DavWWWRoot\,其中 DavWWWRoot 是一个“特殊”(虚拟)卷名
Mac OS
  • 打开 Finder 应用程序
  • 点击“前往”菜单,然后点击“连接到服务器”
  • 输入 https://www.example.com/ 并点击“连接”

某些客户端,例如用 javascript 编写的 Web 客户端,可能需要 跨域资源共享 HTTP 响应头才能连接到 lighttpd WebDAV 服务器。
有关如何设置 HTTP 响应头,请参阅 mod_setenv

litmus 测试

我们使用 http://webdav.org/neon/litmus/(版本 0.14)来验证我们是否支持 WebDAV 规范。(#1818

另外:唯一一个未通过的 litmus 测试与 XML 验证有关,libxml2 对此发出警告但未将其报告为错误。

在 /dev/shm(临时;非持久)中运行 litmus 测试的 litmus.conf 示例

#mkdir -p /dev/shm/dav/dav /dev/shm/db
#lighttpd -D -f litmus.conf &
#cd /dev/shm  # litmus writes child.log and debug.log to current dir
#/usr/bin/litmus -k http://127.0.0.1:8080/
#kill %1      # kill lighttpd process started above
#rm -rf /dev/shm/{dav,db,child.log,debug.log}

server.document-root = "/dev/shm/dav" 
server.bind = "127.0.0.1" 
server.port = 8080
mimetype.assign += ( "" => "application/octet-stream" )

server.modules += ( "mod_webdav" )
webdav.activate = "enable" 
webdav.sqlite-db-name = "/dev/shm/db/webdav.db" 

限制

(不完整列表)

  • 不完整的“共享”锁支持

安装

PUT, DELETE, COPY, MOVE, MKCOL

mod_webdav 是 1.4.x 发行版的一部分,无需任何附加库即可支持 GET、HEAD、OPTIONS、PUT、DELETE、COPY、MOVE、MKCOL。

PROPFIND, PROPPATCH

PROPFIND 和 PROPPATCH 用于执行目录列表并为文件对象附加属性。这涉及解析 XML 数据并存储属性。要编译支持属性的 mod_webdav,需要 libxml2、libxml2-devel、sqlite、sqlite-devel 软件包,并且您必须使用以下命令构建

$ configure --with-webdav-props

LOCK, UNLOCK

LOCK 和 UNLOCK 对于文件系统挂载的正常运行至关重要。这涉及到生成唯一的锁令牌。LOCK 再次包含解析 XML,因此必须提供上一节中的依赖项

$ ./configure --with-webdav-props --with-webdav-locks

gstrauss 大约 1 年 前更新 · 36 个修订版本