一、问题背景
当服务器上需要运行多个网站服务时,我们通常不希望让 Docker 版的 Seafile 独占 80 和 443 端口。在这种情况下,标准做法是使用 Nginx 作为前端反向代理,统一处理流量,并实现强制 HTTPS 跳转。
然而,在配置完毕后,访问 Seafile 网页时可能会遇到 CSRF 错误,页面提示:
CSRF verification failed. Request aborted.
More information is available with DEBUG=True.
通过浏览器开发者工具检查网络请求,可以发现相关接口返回了类似 "untrusted origins" 的错误信息,说明 Seafile 服务端拒绝了来自 Nginx 代理的请求。
二、原因分析
这个问题的根源在于 Seafile 后端使用的 Django 框架所具备的跨站请求伪造(CSRF)保护机制。
在反向代理环境下,Django 默认会验证请求头中的 Host
或 Origin
字段,以确保请求来源于受信任的域。当请求经过 Nginx 代理后,这些信息对于 Seafile 容器内部的 Django 应用来说可能不再是其预期的来源,从而判定该请求为不安全的跨站请求并予以拦截。
三、解决方案
要解决此问题,我们需要明确地告诉 Seafile,从我们的域名(经由 Nginx)发起的请求是安全且可信的。
-
修改 Seafile 配置文件
进入你挂载的 Seafile 数据卷目录,编辑
seahub_settings.py
配置文件。它的通常路径是:
[你的数据卷路径]/seafile/conf/seahub_settings.py
-
添加受信任的域
在该文件中,找到或添加
CSRF_TRUSTED_ORIGINS
配置项,将你的域名添加进去。请务必包含协议名(https://
)。# 将 https://xxx.com 替换为你的实际域名 CSRF_TRUSTED_ORIGINS = ['https://xxx.com']
- 提示:如果文件中已有此配置项,请确保你的域名被正确添加;如果不存在,请在文件末尾追加此行。
-
重启 Seafile 容器
保存文件后,执行以下命令重启 Seafile 容器使配置生效。
docker restart seafile
完成以上步骤后,再次访问你的 Seafile 网站,CSRF 错误应该就已经解决了。