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 是一个“特殊”(虚拟)卷名
- 打开 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