实测日期:2026-09-27(复测);首测 2026-09-23/26
端点:https://<NAS_IP>:5000,SNI / Host = 设备 CN
后端:nginx/1.24.0
复现:python -m minas_webdav probe
| 项 |
结果 |
OPTIONS |
200;DAV: 1,2;Allow: GET,HEAD,PUT,DELETE,MKCOL,COPY,MOVE,PROPFIND,OPTIONS,LOCK,UNLOCK |
| Basic 认证 |
PROPFIND → 207 ✓(账密来自 get_pool_info 或 credentials.env) |
| 无认证 |
→ 451(缺的是 Basic 认证,不是客户端证书) |
| mTLS |
WebDAV 不需要:不带客户端证书、甚至 CA 不校验也照样 207(2026-11-01 实测 A/B/C 三组均 207);证书只对 :443 的 LuCI 池信息 API 必需 |
| Host/SNI |
必须为设备 CN(nas.<uid>.<hash>.0);MKCOL 返回的 Location 头也用 CN 形式 |
| 操作 |
结果 |
PROPFIND Depth: 0 |
207 ✓ |
PROPFIND Depth: 1 |
207 ✓ |
PROPFIND Depth: infinity |
403(nginx 拒绝,递归必须逐层) |
GET 文件 |
200 ✓(字节原样) |
GET Range: bytes=0-1 |
206 ✓ |
GET 目录 |
200,返回 HTML 索引(不可当程序列表用,列目录走 PROPFIND) |
| 操作 |
结果 |
PUT 新建 |
204 ✓ |
PUT 覆盖 |
204 ✓ |
MKCOL |
201 ✓(Location 头为 CN 完整 URL) |
MOVE(Destination = 百分号编码纯路径) |
204 ✓ |
COPY(同上) |
204 ✓ |
MOVE/COPY(Destination = https://<IP>:5000/...) |
400 ✗ |
DELETE 文件/目录 |
204 ✓;不存在 → 404;被锁 → 423 |
LOCK |
200/201 ✓(返回 lockdiscovery,token 在 <D:locktoken><D:href>) |
UNLOCK |
204 ✓(Lock-Token: <opaquelocktoken:...>,带尖括号) |
LOCK Timeout: Second-60 后,即使文件已被 DELETE,同路径上的锁仍存活到超时(423 持续约 60 秒)。
- 因此:连续两次 probe 若用同一路径,第二次会全程 423。
probe 已改为每次生成唯一路径(pid+时间戳)。
DELETE 整个目录返回 204 时会连同被锁子文件一起清掉(实测),但子文件单独 DELETE 仍是 423。
- 请求行按段百分号编码(
cli.enc_path)即可,agent操作区 等实测通过。
Destination 头必须先编码:header 值对 http.client 是 latin-1,裸中文会抛
UnicodeEncodeError(本项目已修复:dest_header() → enc_path(norm(...)))。
POST /cgi-bin/luci/filemgr/get_pool_info(:443 或本机隧道 127.0.0.1:51087)
返回 data.webDAV.username/password 与 data.internal_pool(df 命令数据源)。
- 2026-11-01 实测:带客户端证书 → 200;不带 → HTTP 400(TLS 握手本身能过,
是请求被拒)。所以
df / 自动发现依赖那张 21 天证书,WebDAV 文件操作不依赖。
| 观察 |
推测 |
Depth: infinity 403 |
nginx dav_ext 模块默认 dav_methods 限制或厂商主动关闭,防全盘遍历 |
| 451 状态码 |
实测:不带 Authorization 头即 451(缺 Basic 认证);nginx 用 451 而不是 401/403 是小米定制 |
| 锁删除后残留 |
锁表按路径 key 存储、与 inode 脱钩;也可能是实现简化 |
| 目录 GET 出 HTML 索引 |
nginx autoindex 对 WebDAV collection 生效,非 WebDAV 特性 |
| PUT 204 而非 201 |
服务端对新建/覆盖统一回 204,不区分(RFC 允许) |
|
Samba(445) |
WebDAV(5000,本项目) |
| 范围 |
仅官方发布的共享(现仅 Z: 备份) |
/pool0/data 全池 |
| 认证 |
Windows SMB 会话 |
Basic(不需要 mTLS) |
| 用途 |
资源管理器 / 备份 |
agent 自动化、远程、挂 N 盘 |
两者独立,不要混用路径语法(UNC ≠ WebDAV 路径)。