Tenho uma situação estranha com meu nginx atuando como proxy reverso. Quando meu site de back-end está respondendo a uma solicitação do usuário (navegador do usuário) por meio do proxy reverso nginx, o usuário obterá o protocolo http em redirecionamentos 302 FOUND em vez do protocolo https.
Cheguei a uma situação em que duas coisas no proxy reverso nginx me ajudarão a resolver esta situação com protocolo errado nos redirecionamentos:
add_header Content-Security-Policy "upgrade-insecure-requests";
ou
proxy_redirect http:// https://;
No entanto, a abordagem é muito diferente com esses comandos.
Eu preferiria usar a primeira opção CSP porque parece ser a melhor maneira de resolver isso. No entanto, não tenho certeza do que acontece ao usar a segunda opção 'proxy_redirect'.
Para ser mais específico, meu back-end está escutando HTTP (80) e também HTTPS (443). No entanto, o certificado HTTPS (TLS) no meu back-end expirou. Na configuração do proxy reverso nginx, estou usando o protocolo HTTP para o 'proxy_pass' para back-end.
Quando uso 'proxy_redirect' nesta situação, parece que o proxy reverso nginx falha ao criar o handshake TLS. No entanto, em vez de encerrar a conexão 'proxy_pass', ele continua a se comunicar no protocolo HTTP. Pelo menos é isso que vejo nos logs do servidor web do backend. Da perspectiva do usuário, os redirecionamentos 302 FOUND agora estão configurados para HTTPS, o que parece estar correto. O site parece estar funcionando sem nenhum problema. Não há erros no proxy reverso nginx nem no console.
Então esse comportamento no proxy reverso nginx é normal? Qual opção devo implementar quando não quiser usar uma conexão HTTPS válida para o back-end? O proxy reverso nginx se comportará da mesma maneira com a opção 'proxy_redirect' quando o certificado HTTPS estiver totalmente ausente no back-end?
Então verifiquei a documentação do nginx: https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect
A declaração da diretiva "proxy_redirect" é clara:
Pelo que entendi, a resposta do servidor proxy neste caso é a resposta do servidor web backend. Isso significa que a diretiva "proxy_pass" no protocolo HTTP na porta 80 não tem relação direta com a diretiva "proxy_redirect" e vice-versa.
Isso significa que, neste caso, posso usar livremente a diretiva "proxy_redirect" como solução para o meu problema. A primeira abordagem CSP também está disponível, mas a tarefa de substituir o cabeçalho "Location" de http para https depende dos navegadores dos usuários neste caso. Acho que a melhor solução é atribuir essa responsabilidade ao nginx com a diretiva "proxy_redirect". Se algo der errado, acho melhor confiar nas configurações adequadas do nginx do que em vários navegadores diferentes.