Discourse无法登录 提示未知错误 session报403错误的解决办法

昨天在国内服务器上安装了一个Discourse,在设置完反代后,退出了账号,然后就登录不上了。

登录提示“未知错误”,浏览器检查发现有一个session的路径报错403。在官网论坛找到了同样问题的帖子:Users can't sign in due to 403 error - Installation - Discourse Meta

原来是开启强制HTTPS导致的,按下面的步骤关闭force_https即可登录。

  1. SSH to server SSH 到服务器
  2. cd /var/discourse
  3. ./launcher enter app
  4. rails c
  5. SiteSetting.force_https = false
  6. exit

果断实操一下:

root@123:~# cd /www/dk_project/dk_app/discourse/
root@123:/www/dk_project/dk_app/discourse# ./launcher enter app
x86_64 arch detected.
root@123-app:/var/www/discourse# rails c
Loading production environment (Rails 8.0.3)
discourse(prod)> SiteSetting.force_https = false
=> false
discourse(prod)> exit
root@123-app:/var/www/discourse#

操作之后确实可以登录了,但治标不治本。 Discourse创始人 Jeff Atwood说:

通常是因为您正在进行内部代理,但没有在代理中设置 https 转发标头。

然后按照这个思路,我在Nginx反代规则里加了一行:proxy_set_header X-Forwarded-Proto $scheme;

$scheme 是 Nginx 的一个内置变量,它表示客户端访问 Nginx 时使用的协议方案。

$scheme 的可能取值:

  • http - 当使用 HTTP 协议访问时
  • https - 当使用 HTTPS 协议访问时
  • 其他可能的协议,如 ftp , ws , wss 等(较少见)

然后后台再次开启 Force HTTPS,退出账号重新登录。嗯,这次可以了!

最后,这个问题只出现在宝塔面板中创建的反向代理,1panel中创建的自带这个规则。