hacdias WebDAV 配置参数详解

hacdias/webdav v5.17.0 配置文件各字段详解,覆盖顶层参数、directory/directories 虚拟根、permissions/rules 权限体系、log/cors/listing 子配置、users 用户对象与 WD_ 环境变量映射。

hacdias/webdavhacdias/webdav2026/10/06

hacdias WebDAV 配置参数详解

目标:系统梳理 hacdias/webdav v5.17.0 全部配置参数的含义、默认值与用法,帮助读者理解配置文件(YAML/JSON/TOML)结构并正确搭建多用户 + 权限 + TLS + CORS 的生产 WebDAV 服务。

hacdias/webdav 的配置可通过命令行 flags、环境变量(WD_ 前缀)、配置文件或默认值指定,优先级从高到低:flags > 环境变量 > 配置文件 > 默认值。

配置文件支持 YAML、JSON、TOML 三种格式,启动时若不指定 -c,会自动在 ./ 与 /etc/webdav/ 下查找 config.{json,toml,yaml,yml}。约定:顶层键用 camelCase,section 内键用 snake_case(注意此处 listing 等章节历史上有的用 snake_case)。

1. 顶层参数

# 监听地址,默认 0.0.0.0(所有网卡)
address: 0.0.0.0

# 监听端口,默认 6065
port: 6065

# 是否启用 TLS,默认 false
tls: false

# TLS 证书文件路径,默认 cert.pem
cert: cert.pem

# TLS 私钥文件路径,默认 key.pem
key: key.pem

# WebDAV URL 路径前缀,默认 /
prefix: /

# 调试日志,默认 false
debug: false

# 关闭内容嗅探(禁止根据文件内容推断 Content-Type),默认 false
noSniff: false

# 是否在可信反向代理之后。为 true 时日志使用 X-Forwarded-For 记录远端地址,默认 false
behindProxy: false
键默认值说明
address0.0.0.0绑定地址
port6065监听端口
tlsfalse是否启用 TLS
certcert.pem证书路径
keykey.pem私钥路径
prefix/URL 前缀,如 /dav
debugfalse调试日志
noSnifffalse禁止内容嗅探
behindProxyfalse反向代理后是否信任 XFF

2. 共享根目录:directory / directories

2.1 directory

默认共享根目录,用户未单独指定 directory 时使用它:

# 指向工作目录(裸机默认);compose 场景常见 /data
directory: /data

2.2 directories(多虚拟根)

用 directories 可暴露多个目录作为虚拟根条目(与同一作用域的 directory 互斥):

directories:
  - media: /data/media          # 虚拟挂载名 media → /data/media
  - /data/archive               # 无名字段:直接用路径作为条目标识
  - name: backups               # 显式命名
    path: /data/backups

directories 每条有三种写法:

  • - media: /data/media:键为虚拟名,值为路径
  • - /data/archive:裸路径
  • - name: backups\n path: /data/backups:用 name+path 显式指定

directory 与 directories 在同一作用域互斥,只能选其一。用户级的 directory(见下)可覆盖全局的 directory.

3. 权限:permissions / rules / rulesBehavior

3.1 permissions

用户默认权限,大小写不敏感。可能值组合:

  • C:Create(新建)
  • R:Read(读)
  • U:Update(更新)
  • D:Delete(删除)

组合示例:RC(读+建)、CRUD(全部)。默认 R(只读)。

补充语义:

  • LOCK(加锁)算写操作:路径已存在需要 U,不存在需要 C。
  • 被覆盖也计权:COPY/MOVE 覆盖已存在文件需要 U;覆盖已存在集合会清空其内容,需要 D(作用于集合及其下所有路径)。
permissions: CRUD

3.2 rules

基于路径的细粒度权限规则,默认无。规则从后往前应用——即从列表末尾开始,第一个匹配请求的规则生效。

rules: []

rules 中每条的 permissions 可以是 none(完全禁止)或 C/R/U/D/CRUD 等组合。示例:

# 对 /some/file 完全禁权
- path: /some/file
  permissions: none

# 允许在 /public/access/ 下全部操作
- path: /public/access/
  permissions: CRUD

# 只允许读
- path: /docs/
  permissions: R

rules 路径相对用户的根目录。permissions: none 等价于完全拒绝。

3.3 rulesBehavior

用户定义自己 rules 时,如何处理与全局规则的叠加:

  • overwrite(默认):用户有 rules 时覆盖全局规则,即全局规则对该用户不适用。
  • append:用户 rules 追加到全局规则之后,对该用户先检查其自身规则,再检查全局规则。
rulesBehavior: overwrite

4. 日志:log

log:
  # 日志格式:console | json,默认 console
  format: console

  # 是否启用彩色输出,默认 true;仅 format=console 生效
  colors: true

  # 日志输出目标,可多个,默认 ['stderr']
  outputs:
    - stderr
    - /var/log/webdav.log
键默认值说明
log.formatconsoleconsole / json
log.colorstrue控制台彩色
log.outputs[stderr]输出目标列表,可加文件路径

设置 format: json 便于对接日志系统(Loki、ELK 等)。

5. CORS:cors

当 WebDAV 由浏览器前端调用、或需要跨域访问时配置:

cors:
  # 是否启用 CORS 处理,默认 false
  enabled: true

  # 是否允许携带凭证,默认 false
  credentials: true

  # 允许 Private Network Access 预检请求,默认 false
  allow_private_network: false

  # 允许的主机,默认 ['*']
  allowed_hosts:
    - '*'

  # 允许的请求头,默认含 Authorization/Content-Type/Content-Range/Depth/If/Lock-Token 等
  allowed_headers:
    - Authorization
    - Content-Type
    - Content-Range
    - Depth
    - If
    - Lock-Token
    - Overwrite
    - TimeOut
    - Translate
    - X-Update-Range

  # 允许的方法,默认含全部 WebDAV 方法
  allowed_methods:
    - COPY
    - DELETE
    - GET
    - HEAD
    - LOCK
    - UNLOCK
    - MKCOL
    - MOVE
    - OPTIONS
    - PATCH
    - POST
    - PROPFIND
    - PROPPATCH
    - PUT

  # 暴露给浏览器的响应头
  exposed_headers: []
键默认值说明
cors.enabledfalse是否启用 CORS
cors.credentialsfalse允许携带 Cookie/凭证
cors.allow_private_networkfalse允许 PNA 预检
cors.allowed_hosts['*']允许来源
cors.allowed_headers含 WebDAV 常用头允许请求头
cors.allowed_methods全部 WebDAV 方法允许方法
cors.exposed_headers[]暴露响应头

WebDAV 使用自定义方法与头(PROPFIND、Depth、Destination、Lock-Token 等),跨域场景务必把所需方法/头加入允许列表。

6. HTML 目录列表:listing

对集合的 GET 请求,默认返回 PROPFIND XML;可改为渲染 HTML 目录列表:

listing:
  # 启用 HTML 目录列表,默认 false
  enabled: true

  # 是否隐藏父目录(../)链接,默认 false
  hide_parent_dir: false

  # 是否显示 "Index of <path>" 标题;自定义 header 时忽略,默认 true
  show_path: true

  # 自定义页壳 header / footer(内联或从文件)
  # header: "<!DOCTYPE html><html><head><title>WebDAV</title></head><body>"
  # header_file: /etc/webdav/header.html
  # footer: "</body></html>"
  # footer_file: /etc/webdav/footer.html

排序:URL 参数 ?C=N|M|S 按名称/修改时间/大小排序,?O=A|D 升序/降序。

键默认值说明
listing.enabledfalse启用 HTML 列表
listing.hide_parent_dirfalse隐藏 ../ 链接
listing.show_pathtrue显示路径标题
listing.header_file / footer_file无自定义页壳文件

7. 用户:users

定义用户列表后自动启用 HTTP Basic 认证;未定义任何用户则无认证。每个用户对象字段:

users:
  # 管理员:明文密码 + 全权限
  - username: admin
    password: admin123
    permissions: CRUD

  # john:bcrypt 密码 + 专属目录
  - username: john
    password: "{bcrypt}$2y$10$zEP6oofmXFeHaeMfBNLnP.DO8m.H.Mwhd24/TOX2MWLxAExXi4qgi"
    directory: /data/john

  # 从环境变量注入用户名/密码
  - username: "{env}ENV_USERNAME"
    password: "{env}ENV_PASSWORD"

  # 高级权限:规则覆盖
  - username: basic
    password: basic
    permissions: CRUD
    rules:
      # 不能访问 {user}/some/file
      - path: /some/file
        permissions: none
      # 可在 {user}/public/access/ 内 CRUD
      - path: /public/access/
        permissions: CRUD

用户字段详解

键必填说明
username是用户名
password是明文或 {bcrypt}...;支持 {env}VAR 从环境变量取
directory否该用户专属根目录;不写用全局 directory
permissions否覆盖默认权限
rules否覆盖/追加权限规则(依 rulesBehavior)

password 写法

  1. 明文:password: admin123
  2. bcrypt:password: "{bcrypt}$2a$10$...",用 webdav bcrypt <密码> 生成(见安装篇)。
  3. 环境变量:password: "{env}ENV_PASSWORD",程序运行时读取对应环境变量。

{env} 动态取值

username / password 均可写成 {env}ENV_VAR,从进程环境读取,避免敏感信息写死在配置文件中:

export ENV_USERNAME=demo
export ENV_PASSWORD=demo123

8. 环境变量映射(WD_ 前缀)

所有顶层配置项都可用环境变量覆盖,命名规则:WD_ + 配置项名全大写。例如:

  • WD_PORT=6066 等价于 port: 6066
  • WD_ADDRESS=127.0.0.1 等价于 address: 127.0.0.1
  • WD_TLS=true 等价于 tls: true
export WD_PORT=6065
export WD_ADDRESS=0.0.0.0
webdav -c /etc/webdav/config.yml

9. 配置文件优先级总结

flags(命令行)  >  环境变量(WD_*)  >  配置文件  >  内置默认值

--help 中 -a/-p/-c/-P/-t/--cert/--key 等 flag 优先级最高;未指定 flag 时看环境变量;再未设则看配置文件;最后落到默认值。

10. 权威示例:一份生产可用的配置

# /etc/webdav/config.yml
address: 0.0.0.0
port: 6065
tls: true
cert: /etc/webdav/cert.pem
key: /etc/webdav/key.pem
prefix: /
debug: false
noSniff: false
behindProxy: true

directory: /data
permissions: R
rulesBehavior: overwrite

log:
  format: console
  colors: true
  outputs:
    - stderr

cors:
  enabled: true
  credentials: true
  allowed_hosts:
    - '*'

listing:
  enabled: true
  hide_parent_dir: false

users:
  - username: admin
    password: "{bcrypt}$2a$10$Vytaibe9E8eRgXDGB9.DE.QqzsLrkUQsJ5QyukdIoiTXCTVVqwqdS"
    permissions: CRUD
    rules:
      - path: /public/access/
        permissions: CRUD
  - username: bob
    password: "{env}ENV_BOB_PASSWORD"
    directory: /data/bob
    permissions: CRUD

11. 常见问题

Q1:colors 与 colored 哪个对? 本项目 log 下颜色开关键为 colors(README 示例)。不同版本可能历史遗留 colored,以 webdav --help 与官方 README 为准。

Q2:全局 R、想让某个用户只能写某个目录? 设全局 permissions: R,该用户 permissions: CRUD + rules 限目录;或全局 CRUD + 用户 rules: [{path: /xxx, permissions: none}] 禁止。

Q3:directories 与 directory 能同时用吗? 不能,同一作用域下互斥。

Q4:环境变量传 true 的布尔值怎么写? WD_TLS=true、WD_DEBUG=false;字符串按原样拼接,如 WD_PREFIX=/dav.

12. 参考链接

  • 官方 README(配置章节):https://github.com/hacdias/webdav#configuration
  • 官方仓库:https://github.com/hacdias/webdav
  • RFC 4918 WebDAV:https://www.rfc-editor.org/rfc/rfc4918
  • Docker 配置挂载:https://hub.docker.com/r/hacdias/webdav