Voici ma configuration abrégée vhost nginx:
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, après le traitement d'un formulaire), toutes les demandes HTTPS sont redirigées vers HTTP. La seule chose que j'ai trouvée qui corrigera ce problème est proxy_redirect
la suivante:
proxy_redirect http:// https://;
Cela fonctionne à merveille pour les demandes provenant de HTTPS, mais si une redirection est émise via HTTP, elle redirige également celle-ci 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 ce proxy_redirect
n'est pas autorisé ici.
La seule autre option à laquelle je peux penser est de définir les deux serveurs séparément et de proxy_redirect
ne définir que sur le SSL, mais j'aurais alors dupliqué le reste de la conf (il y a beaucoup dans la server
directive que j'ai omis pour des raisons de simplicité). Je sais que je pourrais également utiliser une include
directive pour prendre en compte la redondance, mais je veux vraiment garder un seul fichier conf sans aucune dépendance.
Donc, d'abord, y a-t-il quelque chose qui me manque qui résoudra complètement le problème? Ou, deuxièmement, sinon, existe-t-il un autre moyen (en plus d'inclure un fichier externe) pour factoriser les informations de configuration redondantes afin que je puisse séparer les versions HTTP et HTTPS de la configuration du serveur?
L'autre solution consiste à indiquer à l'amont si la demande est HTTP ou HTTPS et à lui faire émettre la redirection correspondante. L'ajout de cela dans la configuration nginx définirait un en-tête à inspecter en amont.
la source