本文适合有NAS/有公网服务器又用Zotero阅读论文的读者。事实上,使用ZotFile+iCloud应该也能实现同步功能,但是我感觉没有那么原生就没继续研究。如果没有NAS与公网服务器,可以衡量下开销,毕竟Zotero的20刀一年3G应该也够很多人用了,服务器和NAS一般来说还是比这个服务贵的。
文末更新了nginx一键配置脚本
开始之前
先说说下文要用到的技术栈以及文章内容:
- 云服务器+域名解析:读者自行完成,本文只做推荐不做解释;
- 服务器配置:本文提供一个通用的Guide;
- Apache2与WebDAV配置:本文提供粘贴可用的模板;
- HTTPS配置:本文提供通过CertBot进行验证的方式,也是一键配置;
- Zotero配置:本文提供Guide;
总的来说,本文基本就是一个WebDAV配置的walkthrough guide。不过也可以使用坚果云提供的WebDAV服务,直接配置Zotero,就不需要折腾了。
PS:避雷阿里云盘的“WebDAV服务”,它不能上传,只能下载。
云服务器、域名解析与服务器配置
首先我们要完成的是云服务器+域名解析,其中域名不解析,有公网IP也够用。对于云服务器租赁,我使用的是阿里云+学生优惠,1年2核1G+30G SSD一共108元。
在完成云服务器租赁后,我们启动服务器,就可以进行服务器的配置了。我们先配置服务器环境:
$ sudo apt upgdate && sudo apt upgrade然后就可以了。
Apache2与WebDAV配置
WebDAV是一个网络协议,所以不是一个专用的“软件”,而是会集成在各种服务中。
我们先安装Apache2:
$ sudo apt-get  install  -y apache2然后再启动它的WebDAV服务:
$ cd ~$ sudo a2enmod dav$ sudo a2enmod dav_fs$ sudo systemctl restart apache2接下来就是创建WebDAV所使用的目录路径(可自行更改)并修改权限:
$ sudo mkdir -p /var/www/webdav$ sudo chown -R www-data:www-data  /var/www/webdav然后我们为Zotero在WebDAV中创建一个账户(在此处账户名zotero)并设定密码,然后修改权限:
$ sudo htpasswd -c /etc/apache2/webdav.password zotero$ sudo chown root:www-data /etc/apache2/webdav.password$ sudo chmod 640 /etc/apache2/webdav.password最后我们将以下内容写入/etc/apache2/sites-available/your.domain.com.conf 即可:
Alias /webdav /var/www/webdav<Location /webdav>  Options Indexes  DAV On  AuthType Basic  AuthName "webdav"  AuthUserFile /etc/apache2/webdav.password  Require valid-user</Location>然后重启Apache2:sudo systemctl restart apache2。
在这之后,我们访问http://your-ip:80/webdav就能访问WebDAV服务了。
配置HTTPS(可选,苹果用户必选)
但是,如果你想用苹果移动设备(iPad、iPhone)上的zotero还是不能连接到这个WebDAV,因为他们只支持HTTPS访问。
那么我们继续。首先我们先安装CertBot以及它的Apache扩展:
$ sudo apt install certbot$ sudo apt install python3-certbot-apache然后我们将上一节最后的/etc/apache2/sites-available/your.domain.com.conf修改为如下所示:
<VirtualHost *:80>    ServerName your.domain.com    # 可选:如果你只想做验证,可以设置 DocumentRoot 为任何可访问路径    DocumentRoot /var/www/html
    # 可选:也可以把所有请求重定向到 HTTPS    # RewriteEngine On    # RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]</VirtualHost>然后添加HTTPS相关配置在/etc/apache2/sites-available/your.domain.com-le-ssl.conf中(高亮部分记得修改):
<IfModule mod_ssl.c><VirtualHost *:443>    ServerName your.domain.com
    Alias /webdav /var/www/webdav    <Location /webdav>      Options Indexes      DAV On      AuthType Basic      AuthName "webdav"      AuthUserFile /etc/apache2/webdav.password      Require valid-user    </Location>
    SSLEngine on    Include /etc/letsencrypt/options-ssl-apache.conf    SSLCertificateFile    /etc/letsencrypt/live/your.domain.com/fullchain.pem    SSLCertificateKeyFile /etc/letsencrypt/live/your.domain.com/privkey.pem
    # 可选:强制 HTTP 重定向到 HTTPS    RewriteEngine on    RewriteCond %{HTTPS} !=on    RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R=301,L]</VirtualHost></IfModule>这之后,启用有关Apache模块并重启:
$ sudo a2enmod ssl$ sudo a2enmod rewrite$ sudo systemctl restart apache2最后,我们使用CertBot进行HTTPS证书生成以及配置:
$ sudo certbot --apache -d your.domain.com在Zotero中配置WebDAV
打开设置>同步>文件同步,将同步方式从Zotero更改成WebDAV,然后按需输入相关配置:

配置好后点击右上角的同步即可通过WebDAV进行同步。

至此我们完成了全部配置。
Nginx 一键配置脚本
#!/usr/bin/env bashset -euo pipefail
# ======= 配置参数(修改这里) =======PATH_DIR="/srv/dav"URL_PREFIX="webdav"DAV_USER=""DAV_PASS=""SERVER_NAME="_"ENABLE_AUTOINDEX="on"# ====================================
if [[ $EUID -ne 0 ]]; then  echo "请使用 root 运行:sudo bash $0"  exit 1fi
# -------- 安装 nginx + dav-ext --------apt-get updateDEBIAN_FRONTEND=noninteractive apt-get install -y nginx nginx-extras apache2-utils libnginx-mod-http-dav-ext
# -------- 准备数据目录 --------mkdir -p "$PATH_DIR"NGINX_USER="www-data"id nginx &>/dev/null && NGINX_USER="nginx"chown -R "$NGINX_USER":"$NGINX_USER" "$PATH_DIR"chmod -R 775 "$PATH_DIR"
# -------- 创建 BasicAuth --------HTPASSWD="/etc/nginx/.htpasswd"HASH=$(openssl passwd -apr1 "$DAV_PASS")if [[ -f "$HTPASSWD" ]]; then  if grep -q "^${DAV_USER}:" "$HTPASSWD"; then    sed -i.bak "s#^${DAV_USER}:.*#${DAV_USER}:${HASH}#g" "$HTPASSWD"  else    echo "${DAV_USER}:${HASH}" >> "$HTPASSWD"  fielse  echo "${DAV_USER}:${HASH}" > "$HTPASSWD"fichmod 640 "$HTPASSWD"chown root:"$NGINX_USER" "$HTPASSWD" || true
# -------- 写入 Nginx 配置 --------CONF_DIR="/etc/nginx/sites-available"CONF_PATH="$CONF_DIR/webdav_${URL_PREFIX}.conf"ENABLED_DIR="/etc/nginx/sites-enabled"
mkdir -p "$CONF_DIR" "$ENABLED_DIR"
cat > "$CONF_PATH" <<NGXserver {    listen 80;    server_name ${SERVER_NAME};
    client_max_body_size 0;    client_body_temp_path /var/cache/nginx/client_temp;
    sendfile on;    proxy_read_timeout 600s;    proxy_send_timeout 600s;
    location = /${URL_PREFIX} {        return 301 /${URL_PREFIX}/;    }
    location /${URL_PREFIX}/ {        alias ${PATH_DIR}/;
        # DAV 基础操作        dav_methods PUT DELETE MKCOL COPY MOVE;        create_full_put_path on;        dav_access user:rw group:rw all:r;
        # ★ 扩展 DAV 操作:Zotero 必须(PROPFIND + OPTIONS)        dav_ext_methods PROPFIND OPTIONS;
        # 可选:支持锁(多数客户端不需要)        # dav_ext_lock_zone zone=davlocks:10m;        # dav_ext_lock      zone=davlocks;
        # 基本认证        auth_basic           "WebDAV";        auth_basic_user_file ${HTPASSWD};
        autoindex ${ENABLE_AUTOINDEX};    }}NGX
ln -sf "$CONF_PATH" "/etc/nginx/sites-enabled/$(basename "$CONF_PATH")"
# -------- 测试配置并重载 --------nginx -tsystemctl reload nginx
echo "✅ WebDAV + dav-ext 配置完成!"echo "📁 本地目录:${PATH_DIR}"echo "🌐 WebDAV 地址:http://${SERVER_NAME}/${URL_PREFIX}/"echo "👤 用户名/密码:${DAV_USER} / ${DAV_PASS}"
cat <<TEST
📦 测试命令(PROPFIND):curl -u '${DAV_USER}:${DAV_PASS}' -X PROPFIND -H "Depth: 1" \  --data '<propfind xmlns="DAV:"><allprop/></propfind>' \  http://${SERVER_NAME}/${URL_PREFIX}/
📚 Zotero 设置:WebDAV URL:  http://${SERVER_NAME}/${URL_PREFIX}/用户名:    ${DAV_USER}密码:      ${DAV_PASS}
⚠️ 如果还有 405,请确保:1. dav-ext 模块已启用:  ls /etc/nginx/modules-enabled | grep dav_ext2. 配置文件中有:       dav_ext_methods PROPFIND OPTIONS;3. 重启 Nginx:         sudo systemctl reload nginxTEST