Erreur 403 lors de la modification de n'importe quel paramètre après l'activation de force_https avec proxy

Bonjour à tous, je rencontre un problème : lorsque j’active l’option force_https (après m’être assuré que tout est bien en HTTPS), je ne peux plus :

  • modifier aucun paramètre,
  • me déconnecter (le clic sur « se déconnecter » ne fait rien),
  • ni me connecter (la redirection SSO m’emmène simplement à la page d’accueil déconnectée).

J’ai d’abord pensé qu’il s’agissait d’un incident isolé ou d’une erreur de ma part, alors j’ai supprimé l’application, vidé toutes les données, puis réinitialisé et redémarré l’application.

Avec la nouvelle instance, tout fonctionnait à nouveau parfaitement : j’ai pu restaurer depuis des sauvegardes, configurer tous mes logos, ajuster divers paramètres (modifier les paramètres de notifications par e-mail, changer le titre, personnaliser le CSS du thème, etc.), sans aucune erreur SSL et les images de marque se chargeaient correctement.

Cependant, dès que j’ai réactivé l’option force_https, les erreurs 403 sont réapparues.

Cette fois, je suis entré dans le conteneur et j’ai désactivé l’option force_https via l’interface en ligne de commande en utilisant :

/var/discourse/launcher enter app
rails c
SiteSetting.force_https = false

Dès que l’option a été désactivée, tout sur le site a recommencé à fonctionner normalement.

J’ai essayé d’examiner les journaux (site_url.com/logs), mais il n’y semblait pas grand-chose d’autre que :

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

ce qui provenait d’une période antérieure où je modifiais certains paramètres pour le plugin discourse-chat-integration.

Je ne sais pas comment procéder maintenant et j’apprécierais toute suggestion.

Êtes-vous derrière des proxies étranges ?

Je l’exécute sur un serveur avec une autre application PHP, j’utilise donc un proxy pass Nginx ; voici ma configuration Nginx :

server {
  server_name site_url;
  client_max_body_size 500m;

  location / {
      proxy_pass http://127.0.0.1:8080;
  }

    listen 443 ssl; # géré par Certbot
    ssl_certificate /etc/letsencrypt/live/site_url/fullchain.pem; # géré par Certbot
    ssl_certificate_key /etc/letsencrypt/live/site_url/privkey.pem; # géré par Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # géré par Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # géré par Certbot

}
server {
    if ($host = site_url) {
        return 301 https://$host$request_uri;
    } # géré par Certbot


  listen 80;
  server_name site_url;
    return 404; # géré par Certbot
}

Je pense que vous ne transmettez pas correctement le https. Recherchez des solutions ici.

J’avais complètement oublié de définir les en-têtes de proxy. J’ai ajouté les en-têtes manquants et tout fonctionne maintenant.

Merci !

Au cas où quelqu’un rencontrerait ce problème, voici les en-têtes proxy_pass qui me manquaient :

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;