大家好,我遇到了一个问题:在启用 force_https 选项(在确保所有内容都已切换到 HTTPS 之后)时,我无法:
- 更改任何设置,
- 退出登录(点击退出登录没有任何反应),
- 或登录(SSO 重定向直接跳转到已登出的首页)。
我起初以为这只是偶然现象或是我一开始操作失误,于是我销毁了应用,清空了所有数据,并重新引导/启动了应用。
在新应用中,一切又恢复正常了:我可以从备份恢复数据,配置所有徽标,调整各种设置(更改邮件通知设置、调整标题、自定义主题 CSS 等),并且没有 SSL 错误,品牌图片也能正常加载。
然而,一旦我再次启用 force_https 选项,所有 403 错误又出现了。
这次我进入容器,通过 CLI 禁用了 force_https 选项,命令如下:
/var/discourse/launcher enter app
rails c
SiteSetting.force_https = false
一旦禁用该选项,网站上的所有功能又恢复正常了。
我尝试查看日志(site_url.com/logs),但里面似乎没什么特别的内容,只有:
Error: Forbidden
Url: https://site_url.com/assets/ember_jquery-1d5617356dd43f27b8adbf60ccb854a1f5992b9b9f9e51e32ea7287fc9eeb25b.js
Line: 1
Column: 262166
Window Location: https://site_url.com/admin/plugins/chat/discord
这条日志来自更早之前,当时我正在调整 discourse-chat-integration 插件的一些设置。
我不确定接下来该怎么做,非常希望能得到一些建议。
我在服务器上运行它,并与其他 PHP 应用程序共用,因此我使用了 Nginx 反向代理;我的 Nginx 配置如下:
server {
server_name site_url;
client_max_body_size 500m;
location / {
proxy_pass http://127.0.0.1:8080;
}
listen 443 ssl; # 由 Certbot 管理
ssl_certificate /etc/letsencrypt/live/site_url/fullchain.pem; # 由 Certbot 管理
ssl_certificate_key /etc/letsencrypt/live/site_url/privkey.pem; # 由 Certbot 管理
include /etc/letsencrypt/options-ssl-nginx.conf; # 由 Certbot 管理
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # 由 Certbot 管理
}
server {
if ($host = site_url) {
return 301 https://$host$request_uri;
} # 由 Certbot 管理
listen 80;
server_name site_url;
return 404; # 由 Certbot 管理
}
我认为你没有正确传递 https。在此处搜索解决方案。
完全忘了设置代理头,补上缺失的头后一切正常了。
谢谢!
以防有人遇到这个问题,我缺失的代理传递头如下:
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;