Ecco la mia conf abbreviata nginx vhost:
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 l'elaborazione di un modulo), tutte le richieste HTTPS vengono reindirizzate a HTTP. L'unica cosa che ho scoperto che risolverà questo problema sta cambiando proxy_redirect
nel modo seguente:
proxy_redirect http:// https://;
Funziona meravigliosamente per le richieste provenienti da HTTPS, ma se un reindirizzamento viene emesso su 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 mi viene in mente è quella di definire i due server separatamente e impostare proxy_redirect
solo su quello SSL, ma poi avrei duplicato il resto della conf (c'è molto nella server
direttiva che ho omesso per motivi di semplicità). So che potrei anche usare una include
direttiva per scomporre la ridondanza, ma voglio davvero mantenere solo un file conf senza dipendenze.
Quindi, in primo luogo, c'è qualcosa che mi manca che annullerà del tutto il problema? Oppure, in caso contrario, esiste un altro modo (oltre a includere un file esterno) di fattorizzare le informazioni di configurazione ridondanti in modo da poter separare le versioni HTTP e HTTPS della configurazione del server?