Nginx WebDAV 反向代理配置指南

结论先说:HTTP 方法层面就是普通转发,不用做任何特殊 “开启”;但传输相关的几个参数必须调,否则大文件上传和慢速传输会挂。

为什么 “普通转发” 基本可行

nginx 作为反代会原样透传客户端的全部 HTTP 方法 —— 包括 WebDAV 专用的 PROPFIND、MKCOL、COPY、MOVE、LOCK、UNLOCK 等,所以反代层不需要也不该配置 dav_methods。dav_methods/dav_ext_methods 只属于 nginx 自己充当 WebDAV 服务器时(ngx_http_dav_module),反代场景用了反而没用。认证头 Authorization 默认也会透传,WebDAV 客户端的 Basic 认证能直达 Docker 容器内的服务。

必须注意的四个点

  1. client_max_body_size:nginx 默认只有 1m,上传稍大文件直接 413。设 0(不限)或按需给上限。
  2. 超时:默认 60s,大文件传得慢会超时断开,proxy_read_timeout / proxy_send_timeout 要调大。
  3. proxy_request_buffering off:默认 nginx 会把整个请求体先缓冲到磁盘 / 内存再转发,大文件上传会变慢、占临时空间。WebDAV 反代建议关掉缓冲流式转发。
  4. 路径前缀一致性:这是最容易踩的坑。如果用子路径挂载(如 location /dav/),proxy_pass 里不要带 URI,让完整路径原样传给后端;同时 COPY/MOVE 用的 Destination 头里的路径也要和挂载前缀匹配,否则后端直接 400。

参考配置

location /dav/ {
    proxy_pass http://127.0.0.1:8080;          # 不带 URI,路径原样透传
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;

    client_max_body_size 0;                    # 不限上传大小(或设具体上限)
    client_body_buffer_size 0;
    proxy_request_buffering off;               # 大文件流式转发
    proxy_buffering off;
    proxy_read_timeout 3600s;
    proxy_send_timeout 3600s;
}

Docker 侧建议容器只绑宿主机回环地址,避免端口直接暴露:-p 127.0.0.1:8080:80。反代示例可参考

一个额外提醒

如果用 Windows 自带 WebDAV 客户端(文件资源管理器挂载),它对 Basic 认证和 HTTPS 证书校验很挑剔。如果 Windows 挂载不上,优先查证书、认证方式,而不是怀疑 nginx 反代配置 ——macOS Finder 和第三方客户端(RaiDrive、Cyberduck 等)通常没问题。

另外补充一句:如果你在 nginx 反代层自己又加了 auth_basic,会变成 “双重认证”,某些客户端会挂。要么认证全交给后端,要么就在 nginx 层做、后端放开。

(注:部分内容由豆包工作 AI 生成)