跳转至

dav-ext: NGINX WebDAV PROPFIND,OPTIONS,LOCK,UNLOCK 支持

安装

您可以在任何基于 RHEL 的发行版中安装此模块,包括但不限于:

  • RedHat Enterprise Linux 7, 8, 9 和 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 和 Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-dav-ext
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-dav-ext

通过在 /etc/nginx/nginx.conf 的顶部添加以下内容来启用该模块:

load_module modules/ngx_http_dav_ext_module.so;

本文档描述了 nginx-module-dav-ext v3.0.0,于 2018 年 12 月 17 日发布。


nginx WebDAV PROPFIND,OPTIONS,LOCK,UNLOCK 支持。

关于

标准的 ngx_http_dav_module 提供了部分 WebDAV 实现,仅支持 GET,HEAD,PUT,DELETE,MKCOL,COPY,MOVE 方法。

要在 nginx 中实现完整的 WebDAV 支持,您需要启用标准的 ngx_http_dav_module 以及此模块以支持缺失的方法。

测试

模块测试需要标准的 nginx-tests 和 Perl HTTP::DAV 库。

$ export PERL5LIB=/path/to/nginx-tests/lib
$ export TEST_NGINX_BINARY=/path/to/nginx
$ prove t

锁定

  • 仅支持独占写锁,这是 WebDAV 规范中描述的唯一锁类型。
  • 所有当前持有的锁都保存在一个列表中。检查对象是否受到锁的约束需要 O(n) 操作。大量同时持有的锁可能会降低性能。因此,不建议设置较大的锁超时时间,以免增加锁的数量。

指令

dav_ext_methods

语法: dav_ext_methods [PROPFIND] [OPTIONS] [LOCK] [UNLOCK]
上下文: http, server, location

在当前范围内启用对指定 WebDAV 方法的支持。

dav_ext_lock_zone

语法: dav_ext_lock_zone zone=NAME:SIZE [timeout=TIMEOUT]
上下文: http

定义一个共享区域用于 WebDAV 锁,指定名称和大小。还定义了锁的过期超时时间。默认锁超时时间为 1 分钟。

dav_ext_lock

语法: dav_ext_lock zone=NAME
上下文: http, server, location

在指定范围内启用 WebDAV 锁定。锁存储在由名称指定的共享区域中。该区域必须使用 dav_ext_lock_zone 指令定义。

请注意,尽管此指令在当前范围内启用锁定功能,但 HTTP 方法 LOCK 和 UNLOCK 也应在 dav_ext_methods 中显式指定。

示例 1

简单的无锁定示例:

location / {
    root /data/www;

    dav_methods PUT DELETE MKCOL COPY MOVE;
    dav_ext_methods PROPFIND OPTIONS;
}

示例 2

带锁定的 WebDAV:

http {
    dav_ext_lock_zone zone=foo:10m;

    ...

    server {
        ...

        location / {
            root /data/www;

            dav_methods PUT DELETE MKCOL COPY MOVE;
            dav_ext_methods PROPFIND OPTIONS LOCK UNLOCK;
            dav_ext_lock zone=foo;
        }
    }
}

示例 3

与 MacOS 客户端兼容的带锁定的 WebDAV:

http {
    dav_ext_lock_zone zone=foo:10m;

    ...

    server {
        ...

        location / {
            root /data/www;

            # 启用创建没有尾部斜杠的目录
            set $x $uri$request_method;
            if ($x ~ [^/]MKCOL$) {
                rewrite ^(.*)$ $1/;
            }

            dav_methods PUT DELETE MKCOL COPY MOVE;
            dav_ext_methods PROPFIND OPTIONS LOCK UNLOCK;
            dav_ext_lock zone=foo;
        }
    }
}

GitHub

您可以在 nginx-module-dav-ext 的 GitHub 仓库中找到此模块的其他配置提示和文档。