Ошибка 403 при изменении любых настроек после включения force_https с прокси

Привет, всем. У меня возникла проблема: после включения опции force_https (после того как я убедился, что всё работает по HTTPS) я не могу:

  • изменить какие-либо настройки,
  • выйти из системы (клик по «Выйти» ничего не делает),
  • или войти в систему (перенаправление SSO просто возвращает на главную страницу в состоянии выхода).

Я сначала подумал, что это случайность или что-то, что я сломал изначально, поэтому уничтожил приложение, удалил все данные и заново установил/запустил приложение.

С новым приложением всё снова работало отлично: я смог восстановить данные из резервных копий, настроить все логотипы, изменить различные настройки (настройки уведомлений по электронной почте, заголовок, кастомизировать CSS темы и т. д.), ошибок SSL не было, и изображения бренда загружались корректно.

Однако, как только я снова включил опцию force_https, у меня снова начали появляться ошибки 403.

На этот раз я зашёл в контейнер и отключил опцию force_https через CLI, используя:

/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;