====== 搭建一个简单的 nginx webdav (FreeBSD) ====== ===== 功能简介 ===== * 基于FreeBSD ports的nginx * 多存储空间 * 用户验证 ===== 配置 ===== ==== FreeBSD Ports 编译 ==== 需要选上 HTTP_DAV, 第三方的 HEADERS_MORE 和 HTTP_DAV_EXT 模块 ==== 目录结构 及 变量 ==== 请自行修改以下 * /logs/ 日志存储目录 * /ssl/ SSL证书目录 * /webdav/ webdav主目录 * /webdav/root/ webdav多存储目录 * /webdav/auth/ basic auth用户验证 (htpasswd 格式) * /webdav/temp/ 上传文件的临时目录 * webdav.example.com 为泛域名的基础域名 ==== nginx.conf ==== === 加载模块 === load_module /usr/local/libexec/nginx/ngx_http_dav_ext_module.so; load_module /usr/local/libexec/nginx/ngx_http_headers_more_filter_module.so; === vhosts 设置 === dav_ext_lock_zone zone=dav:10m; server { server_name ~^(.*)\.webdav\.example\.com$; listen 443 ssl http2; listen [::]:443 ssl http2; access_log /logs/webdav.example.com.log; set $webdav_path /webdav; set $webdav_root $webdav_path/root/$1; set $webdav_auth $webdav_path/auth/$1; root $webdav_root; if ( !-d $webdav_root ) { return 404; } if ( !-f $webdav_auth ) { return 404; } ssl_certificate /ssl/fullchain.pem; ssl_certificate_key /ssl/privkey.pem; ssl_stapling on; ssl_stapling_verify on; autoindex on; autoindex_exact_size on; autoindex_localtime on; charset utf-8; client_body_temp_path /webdav/temp; client_max_body_size 0; create_full_put_path on; gzip off; send_timeout 3600; client_body_timeout 3600; lingering_timeout 3600; dav_ext_lock zone=dav; auth_basic on; auth_basic_user_file $webdav_auth; location / { dav_access user:rw group:rw all:r; dav_methods PUT DELETE MKCOL COPY MOVE; dav_ext_methods PROPFIND OPTIONS LOCK UNLOCK; set $dest $http_destination; if (-d $request_filename) { rewrite ^(.*[^/])$ $1/; set $dest $dest/; } if ($request_method ~ (MOVE|COPY)) { more_set_input_headers 'Destination: $dest'; } if ($request_method = MKCOL) { rewrite ^(.*[^/])$ $1/ break; } if ($request_method = PROPPATCH) { add_header Content-Type 'text/xml'; return 207 'HTTP/1.1 200 OK'; } } } === 解读 === 访问 https://a.webdav.example.com, 将访问 /webdav/root/a/ 下的存储空间, 使用 /webdav/auth/a 文件为用户验证文件. ===== 已知问题 ===== ==== Windows ==== * 添加 webdav 路径时, 不管由于任何错误失败后, 要等待一段时间才能重试, 否则一直失败. 解决方案就是等一阵子. 可以尝试重启 webclient 服务 * 默认文件限制为 50000000 字节, 对大于这个的文件下载会报 0x800700DF 错误. 解决方法: 修改注册表, 路径 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters 里面的 FileSizeLimitInBytes 值为十进制 4294967295 (默认值 50000000). 修改后重启系统或重启 webclient 服务