Oto moja skrócona konfiguracja vgin 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;
}
}
Ten sam serwer musi obsługiwać zarówno HTTP, jak i HTTPS, jednak gdy nadrzędny wyda przekierowanie (na przykład po przetworzeniu formularza), wszystkie żądania HTTPS zostaną przekierowane na HTTP. Jedyną rzeczą, którą znalazłem, która naprawi ten problem, jest zmiana proxy_redirect
na następujące:
proxy_redirect http:// https://;
Działa to doskonale w przypadku żądań pochodzących z HTTPS, ale jeśli przekierowanie jest wysyłane przez HTTP, przekierowuje je również do HTTPS, co stanowi problem.
Z desperacji próbowałem:
if ($scheme = 'https') {
proxy_redirect http:// https://;
}
Ale Nginx narzeka, że proxy_redirect
tutaj nie jest dozwolone.
Jedyną inną opcją, jaką mogę wymyślić, jest zdefiniowanie dwóch serwerów osobno i ustawienie proxy_redirect
tylko na SSL, ale wtedy powieliłbym resztę konf (w server
dyrektywie jest wiele rzeczy , których pominąłem dla uproszczenia). Wiem, że mógłbym również użyć include
dyrektywy, aby odrzucić nadmiarowość, ale naprawdę chcę zachować tylko jeden plik conf bez żadnych zależności.
Po pierwsze, czy brakuje mi czegoś, co całkowicie zlikwiduje problem? Albo, po drugie, jeśli nie, czy jest jakiś inny sposób (oprócz dołączenia pliku zewnętrznego), aby oddzielić informacje o zbędnej konfiguracji, aby móc rozdzielić wersje HTTP i HTTPS konfiguracji serwera?