mount.davfs挂载WebDAV报错不支持WebDAV故障排查
问题根因
从抓包获取的OPTIONS响应可以直接定位故障:当前请求拿到的响应完全不符合WebDAV协议规范,客户端判定服务端不支持WebDAV是完全正确的:
- 响应缺少WebDAV协议强制要求的
DAV标识头,这是客户端识别WebDAV服务的核心依据 - 响应声明支持的HTTP方法仅包含
GET, OPTIONS, HEAD,没有WebDAV必备的PROPFIND、PUT、DELETE等核心方法
这个响应并非后端运行的wsgidav服务返回,而是K8s集群前置的Ingress、反向代理或CDN拦截了OPTIONS请求,直接生成静态响应返回,根本没有将请求转发到后端wsgidav服务。
排查步骤
- 绕过集群入口层,直接在集群内部访问wsgidav对应的Service IP和端口,发送OPTIONS请求验证后端服务是否正常:
curl -v -X OPTIONS http://<wsgidav-service-ip>:<service-port>/soilgrids/latest/data/
如果直连Service的响应包含DAV头、且Allow头列出了PROPFIND等WebDAV方法,即可确认故障点在入口代理层。
- 检查Ingress、反向代理、CDN的CORS配置,绝大多数此类故障都是配置CORS规则时,添加了OPTIONS请求直接返回204的短路规则,没有将请求转发给后端,同时仅放通了普通静态站点的HTTP方法。
- 若直连Service返回的响应也不符合WebDAV规范,再检查wsgidav的配置文件,确认目标路径没有被配置为纯静态文件下载模式、未禁用WebDAV扩展方法。
修复方案
- 调整入口代理规则,删除WebDAV路径下OPTIONS请求直接返回204的短路配置,所有该路径下的请求全量转发给后端wsgidav处理。
- 在代理层放通WebDAV所需的全部HTTP方法,至少包含:
OPTIONS, PROPFIND, GET, HEAD, PUT, DELETE, MKCOL, MOVE, COPY, LOCK, UNLOCK - 配置代理规则透传后端返回的
DAV等WebDAV相关响应头,不要在代理层覆盖或过滤这类头。 - 如果使用Nginx Ingress,可通过如下注解放通WebDAV相关配置:
annotations: nginx.ingress.kubernetes.io/http-allowed-methods: "GET, HEAD, POST, PUT, DELETE, MKCOL, COPY, MOVE, OPTIONS, PROPFIND, PROPPATCH, LOCK, UNLOCK" nginx.ingress.kubernetes.io/enable-cors: "true" nginx.ingress.kubernetes.io/cors-allow-methods: "GET, HEAD, POST, PUT, DELETE, MKCOL, COPY, MOVE, OPTIONS, PROPFIND, PROPPATCH, LOCK, UNLOCK"
修复完成后,先用curl验证OPTIONS响应符合WebDAV规范,再执行挂载操作即可恢复正常。
内容的提问来源于stack exchange,提问作者Jorge Mendes
相关产品推荐
相关产品推荐

