Administrator
发布于 2025-12-12 / 6 阅读
0

穿透内网访问qBittorrent时"Unauthorized"错误的根源与优雅解决方案

frp 穿透 + Nginx 反代访问家里 qBittorrent,输入密码后反复弹回登录页。浏览器控制台看 /api/v2/auth/login 返回 401。但内网 IP 直连一切正常。

这跟密码没关系——是 qBittorrent 的 CSRF 防护在搞鬼。

怎么回事

qBittorrent 收到请求时会检查请求来源。你从内网 http://192.168.x.x:8080 访问,Origin 是 http://192.168.x.x:8080,它在自己白名单里,没问题。

通过域名 https://qbt.mydomain.com 访问,浏览器发送的 Origin 是 https://qbt.mydomain.com——qBittorrent 不认识这个来源,认定你是 CSRF 攻击,返回 401。

Nginx 反代虽然帮你把 HTTPS 转成了 HTTP,但它不会改 Origin 头,所以到了 qBittorrent 那里,Origin 和实际连接地址对不上。

修复

在 qBittorrent 的配置文件中加一条 CSRF 白名单。通过 UNRAID 找到容器挂载的配置目录,编辑 qBittorrent.conf


WebUI\CSRFProtection=true
WebUI\HostHeaderValidation=true
WebUI\ServerDomains=*

ServerDomains=* 就是告诉 qBittorrent:接受任何域名的请求。如果你只想允许特定域名:


WebUI\ServerDomains=你的域名.com,内网IP:端口

改完重启容器:


docker restart qbittorrent

再通过域名访问,登录正常了。

为什么不用 Nginx 修

有人会提议在 Nginx 里用 proxy_set_header Origin 把外部域名替换成内网地址。能做,但多了一层 magic behavior,以后排错得同时查 Nginx 和 qBittorrent 两层。直接改 qBittorrent 配置更干净——问题在一层,修在一层。