Nginx 默认支持 WebDav,但 PROPFIND OPTIONS 等操作还不支持。如果需要在普通客户端打开,需要手动添加模块 nginx-dav-ext-module

Install

通过 nginx -V 获取目前本机 nginx 默认的编译参数

git clone https://github.com/arut/nginx-dav-ext-module

接着在 nginx 源码目录添加下面的编译参数

./configure \
    ...
    --with-http_dav_module \
    --add-module=../nginx-dav-ext-module

make
install

记得把原来的卸载清理干净,因为可能会使用一些原来 nginx 存在的模块,导致 nginx 异常

在 nginx.conf(/etc/nginx/nginx.conf) 中添加下面的一个新域名

server {
    listen 80;
    server_name xxx.com;

    location / {
        root /data/dav;
        # alias /data/dav;
        autoindex on;
        dav_methods PUT DELETE MKCOL COPY MOVE;
        # 需要 nginx-dav-ext-module 才有下面的选项
        dav_ext_methods PROPFIND OPTIONS;
        create_full_put_path on;
        dav_access user:rw group:r all:r;
        auth_basic "Authorized Users Only";
        auth_basic_user_file /etc/nginx/htpasswd;
    }
}

上面的配置中 auth_basic_user_file 需要用 htpasswd 生成用户库,之后重启即可

客户端

  • 在浏览器直接访问 http://xxx.com 即可,提示用户名密码后,就可以访问。
  • 使用 MacOS 的 Finder,Command+K,打开服务器连接,输入 http://xxx.com,填入用户密码
  • 使用专业的客户端: iOS 用 Coda.app

使用命令行操作 DAV 文件

把 stdin 转为二进制流传送到 DAV

echo 'bbb' | curl -X PUT -u username:password 'example.com/ii' --data-binary @-
cat file | ...

上传文件

curl -X PUT -u username:password 'example.com/ii' --data-binary @/home/user/filename

删除文件

curl -X DELETE -u yantze:password s.vastiny.com/filename

简单的写了一个脚本

#!/usr/bin/env bash
set -eu

# 三个行为:
# 一个参数,无流,参数为远程相对路径,获取文件内容
# 一个参数,读取流文件,参数为远程相对路径
# 两个参数,第一参数本地路径,第二参数远程相对路径

WEBDAV="http://xxx.com"
DAVUSER="username"
DAVPASS="password"

# Get file content
if [[ $# -eq 1 && -t 0 ]]; then
  curl -su "$DAVUSER:$DAVPASS" "$WEBDAV/$1"

# Upload file
elif [[ $# -eq 1 && -n $1 ]]; then
  curl -X PUT -u "$DAVUSER:$DAVPASS" "$WEBDAV/$1" --data-binary @-
  echo "$WEBDAV/$1"
elif [[ $# -eq 2 && -n $1 && -n $2 ]]; then
  LOCALFILE="$(\cd "$(\dirname "$1")" && \pwd)/$(\basename "$1")"
  curl -X PUT -u "$DAVUSER:$DAVPASS" "$WEBDAV/$2" --data-binary @"$LOCALFILE"
  echo "$WEBDAV/$2"
fi

使用示例

$ echo "example string" | pan ex1.txt
http://xxx.com/slid/ex1.txt

$ pan ex1.txt
example string

$ echo "example string2" > local_ex1.txt

$ pan local_ex1.txt ex1.txt
http://xxx.com/slid/local_ex1.txt

$ pan ex1.txt
example string2

更多 DAV 指令可以自行探索

用途

  • 简单的加密网站
  • 当作网盘使用

这样的设置 WebDav 一旦发现,容易被爆破,所以真的有价值的内容,可能需要再做进一步处理。

REF

  • https://moongazer.me/2014/08/11/build-WebDAV-server-using-nginx/
  • http://jameszhan.github.io/2015/02/25/setup-webdav-with-nginx-in-osx.html