Empêchez nginx de rediriger le trafic de https vers http lorsqu'il est utilisé comme proxy inverse

Voici ma branche nginx vhost abrégée:

upstream gunicorn { server 127.0.0.1:8080 fail_timeout=0; } server { listen 80; listen 443 ssl; server_name domain.com ~^.+\.domain\.com$; location / { try_files $uri @proxy; } location @proxy { proxy_pass_header Server; proxy_redirect off; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; proxy_connect_timeout 10; proxy_read_timeout 120; proxy_pass http://gunicorn; } } 

Le même serveur doit servir à la fois HTTP et HTTPS, cependant, lorsque l'amont émet une redirection (par exemple, une fois qu'un formulaire est traité), toutes les requêtes HTTPS sont redirigées vers HTTP. La seule chose que j'ai trouvée qui corrigera ce problème est de modifier proxy_redirect vers le suivant:

 proxy_redirect http:// https://; 

Cela fonctionne merveilleusement pour les demandes provenant de HTTPS, mais si une redirection est émise sur HTTP, elle redirige elle aussi vers HTTPS, ce qui est un problème.

Par désespoir, j'ai essayé:

 if ($scheme = 'https') { proxy_redirect http:// https://; } 

Mais nginx se plaint que proxy_redirect n'est pas autorisé ici.

La seule autre option que je peux envisager est de définir séparément les deux serveurs et de définir proxy_redirect uniquement sur le SSL, mais j'aurais dupliquer le reste du conf (il y a beaucoup dans la directive du server que j'ai omis pour le bien de la simplicité) . Je sais que je pourrais également utiliser une directive d' include pour prendre en compte la redondance, mais je veux vraiment garder un seul fichier conf sans aucune dépendance.

Donc, d'abord, est-ce qu'il me manque quelque chose qui va nier entièrement le problème? Ou, deuxièmement, sinon, existe-t-il d'autres moyens (en plus d'un fichier externe) pour prendre en compte les informations de configuration redondantes afin que je puisse séparer les versions HTTP et HTTPS de la configuration du serveur?

  • Pourquoi mon ALPN n'est-il pas pris en charge par mon server?
  • En utilisant wireshark pour déterminer quelle conversation SSL RSA PRIVATE KEY?
  • Quel pourcentage d'internautes utilisent les browsers / OS qui supportent SNI?
  • Utilisation de plusieurs certificats SSL dans Tomcat 7 pour une application web
  • Gitlab HTTPS URI pour le clonage de dépôt ne fonctionne pas - L'hôte SSL n'a pas pu être vérifié - fatal: impossible d'accéder
  • Comment installer un certificate SSL de rlocation sur un server Mac OS X?
  • Problème de certificate provoquant l'échec du code
  • Obtenir le contenu de l'ancien .CSR
  • 2 Solutions collect form web for “Empêchez nginx de rediriger le trafic de https vers http lorsqu'il est utilisé comme proxy inverse”

    Eh bien, j'ai eu un peu d'inspiration et j'ai essayé:

     proxy_redirect http:// $scheme://; 

    Ce qui semble faire l'affaire. Cela me semble encore piquant, mais je souhaite toujours des conseils sur tout ce que je ferais de mal ou moins de moyens pour obtenir le même résultat.

    L'autre solution est d'indiquer à l'amont si la requête est HTTP ou HTTPS et elle fait l'objet de la redirection appropriée. L'ajout de ceci dans la configuration nginx définirait un en-tête pour l'amont pour inspecter.

     proxy_set_header X-Scheme $scheme; 
    Les astuces du serveur de linux et windows, tels que ubuntu, centos, apache, nginx, debian et des sujets de réseau.