解决Nginx反向代理Seafile后的CSRF验证失败问题

一、问题背景

当服务器上需要运行多个网站服务时,我们通常不希望让 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 默认会验证请求头中的 HostOrigin 字段,以确保请求来源于受信任的域。当请求经过 Nginx 代理后,这些信息对于 Seafile 容器内部的 Django 应用来说可能不再是其预期的来源,从而判定该请求为不安全的跨站请求并予以拦截。

三、解决方案

要解决此问题,我们需要明确地告诉 Seafile,从我们的域名(经由 Nginx)发起的请求是安全且可信的。

  1. 修改 Seafile 配置文件

    进入你挂载的 Seafile 数据卷目录,编辑 seahub_settings.py 配置文件。它的通常路径是:
    [你的数据卷路径]/seafile/conf/seahub_settings.py

  2. 添加受信任的域

    在该文件中,找到或添加 CSRF_TRUSTED_ORIGINS 配置项,将你的域名添加进去。请务必包含协议名(https://)。

    # 将 https://xxx.com 替换为你的实际域名
    CSRF_TRUSTED_ORIGINS = ['https://xxx.com']
    • 提示:如果文件中已有此配置项,请确保你的域名被正确添加;如果不存在,请在文件末尾追加此行。
  3. 重启 Seafile 容器

    保存文件后,执行以下命令重启 Seafile 容器使配置生效。

    docker restart seafile

完成以上步骤后,再次访问你的 Seafile 网站,CSRF 错误应该就已经解决了。

Terence
花非花,雾非雾。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注