Aqui está o meu abreviado 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;
}
}
O mesmo servidor precisa atender HTTP e HTTPS; no entanto, quando o upstream emite um redirecionamento (por exemplo, após o processamento de um formulário), todas as solicitações HTTPS são redirecionadas para HTTP. A única coisa que encontrei que corrigirá esse problema é proxy_redirect
a seguinte:
proxy_redirect http:// https://;
Isso funciona maravilhosamente para solicitações provenientes de HTTPS, mas se um redirecionamento for emitido por HTTP, ele também será redirecionado para HTTPS, o que é um problema.
Por desespero, tentei:
if ($scheme = 'https') {
proxy_redirect http:// https://;
}
Mas o nginx reclama que proxy_redirect
não é permitido aqui.
A única outra opção em que posso pensar é definir os dois servidores separadamente e configurá-los proxy_redirect
apenas no servidor SSL, mas então eu duplicaria o restante do conf (há muita server
diretiva que eu omiti por questão de simplicidade). Eu sei que também poderia usar uma include
diretiva para fatorar a redundância, mas eu realmente quero manter apenas um arquivo conf sem nenhuma dependência.
Então, primeiro, há algo que está faltando que negará completamente o problema? Ou, segundo, se não, existe outra maneira (além de incluir um arquivo externo) de fatorar as informações de configuração redundantes para que eu possa separar as versões HTTP e HTTPS da configuração do servidor?