Zotero满了?试试WebDAV!

Tip

本文适合有NAS/有公网服务器又用Zotero阅读论文的读者。事实上,使用ZotFile+iCloud应该也能实现同步功能,但是我感觉没有那么原生就没继续研究。如果没有NAS与公网服务器,可以衡量下开销,毕竟Zotero的20刀一年3G应该也够很多人用了,服务器和NAS一般来说还是比这个服务贵的。

Note

文末更新了nginx一键配置脚本

开始之前

先说说下文要用到的技术栈以及文章内容:

  • 云服务器+域名解析:读者自行完成,本文只做推荐不做解释;
  • 服务器配置:本文提供一个通用的Guide;
  • Apache2与WebDAV配置:本文提供粘贴可用的模板;
  • HTTPS配置:本文提供通过CertBot进行验证的方式,也是一键配置;
  • Zotero配置:本文提供Guide;

总的来说,本文基本就是一个WebDAV配置的walkthrough guide。不过也可以使用坚果云提供的WebDAV服务,直接配置Zotero,就不需要折腾了。

PS:避雷阿里云盘的“WebDAV服务”,它不能上传,只能下载。

云服务器、域名解析与服务器配置

首先我们要完成的是云服务器+域名解析,其中域名不解析,有公网IP也够用。对于云服务器租赁,我使用的是阿里云+学生优惠,1年2核1G+30G SSD一共108元。

在完成云服务器租赁后,我们启动服务器,就可以进行服务器的配置了。我们先配置服务器环境:

Terminal window
$ sudo apt upgdate && sudo apt upgrade

然后就可以了。

Apache2与WebDAV配置

Note

WebDAV是一个网络协议,所以不是一个专用的“软件”,而是会集成在各种服务中。

我们先安装Apache2:

Terminal window
$ sudo apt-get install -y apache2

然后再启动它的WebDAV服务:

Terminal window
$ cd ~
$ sudo a2enmod dav
$ sudo a2enmod dav_fs
$ sudo systemctl restart apache2

接下来就是创建WebDAV所使用的目录路径(可自行更改)并修改权限:

Terminal window
$ sudo mkdir -p /var/www/webdav
$ sudo chown -R www-data:www-data /var/www/webdav

然后我们为Zotero在WebDAV中创建一个账户(在此处账户名zotero)并设定密码,然后修改权限:

Terminal window
$ 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 即可:

/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扩展:

Terminal window
$ sudo apt install certbot
$ sudo apt install python3-certbot-apache

然后我们将上一节最后的/etc/apache2/sites-available/your.domain.com.conf修改为如下所示:

/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中(高亮部分记得修改):

/etc/apache2/sites-available/000-default.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模块并重启:

Terminal window
$ sudo a2enmod ssl
$ sudo a2enmod rewrite
$ sudo systemctl restart apache2

最后,我们使用CertBot进行HTTPS证书生成以及配置:

Terminal window
$ sudo certbot --apache -d your.domain.com

在Zotero中配置WebDAV

打开设置>同步>文件同步,将同步方式从Zotero更改成WebDAV,然后按需输入相关配置:

202507101717228

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

202507101719977

至此我们完成了全部配置。

Nginx 一键配置脚本

#!/usr/bin/env bash
set -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 1
fi
# -------- 安装 nginx + dav-ext --------
apt-get update
DEBIAN_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"
fi
else
echo "${DAV_USER}:${HASH}" > "$HTPASSWD"
fi
chmod 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" <<NGX
server {
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 -t
systemctl 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_ext
2. 配置文件中有: dav_ext_methods PROPFIND OPTIONS;
3. 重启 Nginx: sudo systemctl reload nginx
TEST