プロキシで force_https を有効にした後、設定を変更すると 403 エラーが発生する

こんにちは、皆さん。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;