Impedire a nginx di redirect il traffico da https a http quando viene utilizzato come proxy inverso

Ecco la mia abbreviazione nginx vhost conf:

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

Lo stesso server deve servire sia HTTP che HTTPS, tuttavia, quando l'upstream emette un reindirizzamento (ad esempio, dopo che un module viene elaborato), tutte le richieste HTTPS vengono reindirizzate a HTTP. L'unica cosa che ho trovato che correggerà questo problema sta cambiando proxy_redirect nei seguenti proxy_redirect :

 proxy_redirect http:// https://; 

Che funziona meravigliosamente per le richieste provenienti da HTTPS, ma se un reindirizzamento viene rilasciato tramite HTTP, lo reindirizza anche a HTTPS, il che è un problema.

Per disperazione, ho provato:

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

Ma nginx si lamenta che proxy_redirect non è consentito qui.

L'unica altra opzione che posso pensare è definire separatamente i due server e impostare proxy_redirect solo su uno SSL, ma poi avrei duplicato il resto del conf (c'è molto nella direttiva server che ho omesso per semplicità) . So che potrei anche usare una direttiva di include per fatturare la ridondanza, ma voglio davvero mantenere un solo file conf senza alcuna dipendenza.

Quindi, in primo luogo, c'è qualcosa che mi manca che nega completamente il problema? O, in secondo luogo, se no, c'è qualche altro modo (oltre a includere un file esterno) per fatturare le informazioni di configuration ridondanti in modo da poter separare le versioni HTTP e HTTPS del server config?

  • SSL, CNAME e domini multipli
  • Limitare l'utilizzo di SSL a una sola directory in Apache
  • Il certificato SSL di godaddy mostra il nome di dominio invece del nome completo della società
  • Problemi con la versione 2 ssl disabilitata nel server ubuntu. Posso distriggersre anche la versione 3 di ssl per risolvere i problemi?
  • Imansible get Nginx per servire la catena del certificato corretto
  • Reindirizzare il browser basato su protocollo o cifratura SSL / TLS non negoziabile
  • C'è un bilanciere di carico di software Linux HA che serve HTTPS per più nomi di dominio non correlati, ma equilibra a un singolo cluster di server web?
  • 421 Richiesta errata utilizzando HTTP / 2 e SAN SSL
  • 2 Solutions collect form web for “Impedire a nginx di redirect il traffico da https a http quando viene utilizzato come proxy inverso”

    Beh, ho un po 'di ispirazione e ho provato:

     proxy_redirect http:// $scheme://; 

    Che sembra fare il trucco. Questo mi sembra ancora pericoloso per me, per cui sono comunque benvenuto a qualsiasi guida su qualsiasi cosa faccio male o less modi per arrivare allo stesso risultato.

    L'altra soluzione è indicare all'elemento a monte se la richiesta è HTTP o HTTPS e che la rilascia secondo il reindirizzamento. Aggiungendolo nel config di nginx imposterebbe un'intestazione per l'upstream per ispezionare.

     proxy_set_header X-Scheme $scheme; 
    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.