适用于阿里云服务器(或其他云服务器),使用宝塔面板搭建支持 HTTPS 的 WebDAV 服务,可作为私人网盘或文件同步服务使用。
一、准备工作
1.1 环境要求
- 一台云服务器(阿里云 / 腾讯云 / 华为云等),已安装宝塔面板
- 一个已解析到服务器的域名(本教程以 dav.example.com 为例,请替换为你自己的域名)
- 服务器操作系统:CentOS / Alibaba Cloud Linux / RHEL 系列
1.2 放行端口
在开始前,必须先在云服务商控制台放行端口:
| 端口 | 用途 |
|---|---|
80 |
HTTP 访问 |
443 |
HTTPS 访问 |
操作路径:阿里云控制台 → 安全组 → 配置规则 → 入方向 → 添加安全组规则
⚠️ 注意:宝塔面板自身的「安全」菜单中,也需要放行相应端口,两边缺一不可。
二、申请 SSL 证书(启用 HTTPS)
- 登录宝塔面板,进入 「网站」 页面
- 点击 「添加站点」:
- 域名:填写你的域名(如
www.dav.example.com) - 根目录:
/WebDAV(建议使用此路径) - PHP 版本:选择任意版本(WebDAV 不需要 PHP,但如果站点有其他用途可按需选择)
- 域名:填写你的域名(如
- 站点创建成功后,点击站点 「设置」 → 「SSL」
- 选择 「Let's Encrypt」,勾选你的域名,点击 「申请」
- 申请成功后,确保「强制 HTTPS」处于开启状态
💡 提示:如果申请证书时报
DNS problem: NXDOMAIN 错误,说明域名未解析或解析未生效,请先去域名解析商处添加 A 记录。三、确认 Nginx 支持 WebDAV
3.1 检查模块是否已安装
通过 SSH 连接服务器,执行以下命令:
nginx -V 2>&1 | grep -o with-http_dav_module
- 如果有输出
with-http_dav_module:说明基础模块已安装,继续下一步。 - 如果没有任何输出:说明模块未安装,需要重新编译 Nginx。
3.2 如果缺少模块,重新编译 Nginx
- 下载 WebDAV 扩展模块:
git clone https://github.com/arut/nginx-dav-ext-module.git /www/server/nginx-dav-ext-module - 在宝塔面板 「软件商店」 中,卸载当前已安装的 Nginx。
- 重新点击 Nginx 「安装」,务必选择「编译安装」,在「自定义模块」或「编译参数」中完整填入:
--with-http_dav_module --add-module=/www/server/nginx-dav-ext-module --with-http_ssl_module - 点击提交,等待编译完成(约 15-30 分钟)。
- 验证安装:
nginx -V 2>&1 | grep -o with-http_dav_module nginx -V 2>&1 | grep "dav-ext"两个命令都应有输出。
四、配置 Nginx 站点
4.1 修改站点配置文件
在宝塔面板中,点击站点 「设置」 → 「配置文件」,将以下内容完整替换(注意替换其中的域名为你自己的域名):
# ============================================================
# 请将下方所有 dav.example.com 替换为你的实际域名
# ============================================================
server
{
listen 80;
listen 443 ssl;
http2 on;
server_name dav.example.com www.dav.example.com; # 替换为你的域名
index index.php index.html index.htm default.php default.htm default.html;
root /WebDAV; # WebDAV 根目录
#CERT-APPLY-CHECK--START
include /www/server/panel/vhost/nginx/well-known/dav.example.com.conf; # 替换为你的域名
#CERT-APPLY-CHECK--END
include /www/server/panel/vhost/nginx/extension/dav.example.com/*.conf; # 替换为你的域名
#SSL-START
#HTTP_TO_HTTPS_START
set $isRedcert 1;
if ($server_port != 443) {
set $isRedcert 2;
}
if ( $uri ~ /\.well-known/ ) {
set $isRedcert 1;
}
if ($isRedcert != 1) {
rewrite ^(/.*)$ https://$host$1 permanent;
}
#HTTP_TO_HTTPS_END
ssl_certificate /www/server/panel/vhost/cert/dav.example.com/fullchain.pem; # 替换为你的域名
ssl_certificate_key /www/server/panel/vhost/cert/dav.example.com/privkey.pem; # 替换为你的域名
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_tickets on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000";
error_page 497 https://$host$request_uri;
#SSL-END
#ERROR-PAGE-START
error_page 404 /404.html;
#ERROR-PAGE-END
#PHP-INFO-START
include enable-php-82.conf;
#PHP-INFO-END
#REWRITE-START
include /www/server/panel/vhost/rewrite/dav.example.com.conf; # 替换为你的域名
#REWRITE-END
# ============================================================
# 以下为 WebDAV 核心配置(关键!)
# ============================================================
location / {
# WebDAV 核心指令
dav_methods PUT DELETE MKCOL COPY MOVE;
dav_ext_methods PROPFIND OPTIONS LOCK UNLOCK;
create_full_put_path on;
dav_access user:rw group:r all:r;
client_max_body_size 102400M;
# 密码验证
auth_basic "WebDAV Login";
auth_basic_user_file /www/wwwroot/dav.example.com/.htpasswd; # 替换为你的站点目录
}
# 禁止访问的敏感文件
location ~* (\.user.ini|\.htaccess|\.htpasswd|\.env.*|\.project|\.bashrc|\.bash_profile|\.bash_logout|\.DS_Store|\.gitignore|\.gitattributes|LICENSE|README\.md|CLAUDE\.md|CHANGELOG\.md|CHANGELOG|CONTRIBUTING\.md|TODO\.md|FAQ\.md|composer\.json|composer\.lock|package(-lock)?\.json|yarn\.lock|pnpm-lock\.yaml|\.\w+~|\.swp|\.swo|\.bak(up)?|\.old|\.tmp|\.temp|\.log|\.sql(\.gz)?|docker-compose\.yml|docker\.env|Dockerfile|\.csproj|\.sln|Cargo\.toml|Cargo\.lock|go\.mod|go\.sum|phpunit\.xml|phpunit\.xml|pom\.xml|build\.gradl|pyproject\.toml|requirements\.txt|application(-\w+)?\.(ya?ml|properties))$
{
return 404;
}
# 禁止访问的敏感目录
location ~* /(\.git|\.svn|\.bzr|\.vscode|\.claude|\.idea|\.ssh|\.github|\.npm|\.yarn|\.pnpm|\.cache|\.husky|\.turbo|\.next|\.nuxt|node_modules|runtime)/ {
return 404;
}
# SSL证书验证目录
location ~ \.well-known{
allow all;
}
# 禁止在证书验证目录放入敏感文件
if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) {
return 403;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
error_log /dev/null;
access_log /dev/null;
}
location ~ .*\.(js|css)?$
{
expires 12h;
error_log /dev/null;
access_log /dev/null;
}
access_log /www/wwwlogs/dav.example.com.log; # 替换为你的域名
error_log /www/wwwlogs/dav.example.com.error.log; # 替换为你的域名
}
⚠️ 注意:将配置中所有
dav.example.com 替换为你的实际域名。五、创建访问密码
5.1 生成密码文件
WebDAV 需要用户名密码验证。通过 SSH 执行以下命令:
# 生成加密密码(将「你的密码」替换为你的实际密码)
openssl passwd -apr1 你的密码 > /tmp/pwd.txt
# 创建密码文件(将「你的用户名」替换为你的实际用户名)
echo "你的用户名:$(cat /tmp/pwd.txt)" > /www/wwwroot/你的站点目录/.htpasswd
# 查看密码文件内容,确认格式正确
cat /www/wwwroot/你的站点目录/.htpasswd
正确的密码文件格式应为:
用户名:$apr1$xxxxx$xxxxxxxxxxxxxxxxxxxxx
💡 提示:如果系统提示
openssl: command not found,先安装:yum install -y openssl5.2 设置密码文件权限
chown www:www /www/wwwroot/你的站点目录/.htpasswd
chmod 644 /www/wwwroot/你的站点目录/.htpasswd
六、创建 WebDAV 根目录并设置权限
# 创建根目录
mkdir -p /WebDAV
# 设置所有者(宝塔 Nginx 运行用户为 www)
chown -R www:www /WebDAV
chmod -R 755 /WebDAV
💡
.user.ini 的权限警告可以忽略,不影响 WebDAV 功能。七、重启 Nginx 并验证
7.1 测试配置并重启
# 测试配置文件语法
nginx -t
# 重载 Nginx
nginx -s reload
如果 nginx -t 报错,根据提示修正配置文件后再重试。
7.2 验证 WebDAV 功能
# 测试 PROPFIND(列出文件)
curl -k -u 用户名:密码 -X PROPFIND https://你的域名/ -H "Depth: 1"
# 测试上传
echo "Hello WebDAV" > /tmp/hello.txt
curl -k -u 用户名:密码 -T /tmp/hello.txt https://你的域名/hello.txt
# 验证上传是否成功
curl -k -u 用户名:密码 -X PROPFIND https://你的域名/ -H "Depth: 1"
成功标志:返回 HTTP/1.1 207 Multi-Status 和 XML 格式的文件列表,并能看到上传的 hello.txt。
八、客户端连接
8.1 连接信息
| 项目 | 内容 |
|---|---|
| 地址 | https://你的域名/ |
| 用户名 | 你设置的用户名 |
| 密码 | 你设置的密码 |
8.2 Windows 客户端推荐:RaiDrive
- 下载安装 RaiDrive(免费版即可)
- 点击 「添加」 → 选择 「NAS」 → 「WebDAV」
- 填写信息:
字段 填写内容 地址 你的域名(如www.dav.example.com,不要写https://)端口 443(保持默认)用户名 你设置的用户名 密码 你设置的密码 协议 ✅ 勾选 HTTPS - 点击 「确定」,即可在「此电脑」中看到映射的磁盘。
8.3 macOS 客户端
- 打开 「访达」
- 顶部菜单栏 → 「前往」 → 「连接服务器」
- 输入:
https://你的域名/ - 点击连接,输入用户名和密码
8.4 手机客户端
- Android:ES文件浏览器、Solid Explorer
- iOS:Documents、FileExplorer
九、常见问题与解决方案
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
405 Not Allowed |
Nginx 缺少 WebDAV 模块或配置缺失 | 确认 dav_methods 和 dav_ext_methods 已正确配置;检查是否缺少 dav-ext 模块 |
500 Internal Server Error |
密码文件格式错误或路径不对 | 使用 openssl passwd 重新生成密码文件,确保格式为 用户名:加密密码 |
401 Unauthorized |
用户名/密码错误或客户端填写方式不对 | 用 curl 测试验证密码是否正确;检查客户端是否在地址中误写了 https:// |
Connection refused |
端口未放行 | 检查云服务商安全组 + 宝塔「安全」菜单,确保 80/443 端口已放行 |
证书申请失败 NXDOMAIN |
域名未解析 | 去域名解析商添加 A 记录,指向服务器 IP |
conflicting server name 警告 |
多个站点绑定了同一域名 | 可在宝塔中检查其他站点配置,无影响可忽略 |
十、安全提醒
- 使用复杂密码:建议使用大小写字母 + 数字 + 特殊字符的组合
- 启用 HTTPS:本教程已配置 SSL 证书,传输过程加密,防止密码被窃听
- 定期更新证书:Let's Encrypt 证书有效期为 90 天,宝塔面板会自动续期
- 限制访问 IP(可选):如果只有自己使用,可在 Nginx 配置中添加
allow 你的IP; deny all;限制来源 IP
附录:常用命令速查
# 检查 WebDAV 模块是否安装
nginx -V 2>&1 | grep -o with-http_dav_module
# 检查 dav-ext 扩展模块
nginx -V 2>&1 | grep "dav-ext"
# 测试 Nginx 配置语法
nginx -t
# 重载 Nginx 配置
nginx -s reload
# 重新生成密码文件
openssl passwd -apr1 新密码 > /tmp/pwd.txt
echo "用户名:$(cat /tmp/pwd.txt)" > /www/wwwroot/你的站点目录/.htpasswd
# 验证 WebDAV 服务
curl -k -u 用户名:密码 -X PROPFIND https://你的域名/ -H "Depth: 1"
# 上传测试文件
curl -k -u 用户名:密码 -T /tmp/hello.txt https://你的域名/hello.txt
# 查看 Nginx 错误日志
tail -20 /www/wwwlogs/你的域名.error.log