Uma causa bastante típica desse loop de redirecionamento infinito é quando você faz o descarregamento de SSL ou a terminação SSL em um balanceador de carga ou em um CDN, o que faz com que todo o tráfego para o servidor real seja sempre HTTP simples.
Quando você configura um redirecionamento para HTTPS no servidor da web, você tem uma situação como esta:
1. Client ---> HTTP ----> load balancer ----> HTTP ----> Your server
|
<------- Response: Redirect to HTTPS <-
2. Client ---> HTTPS ----> load balancer ----> HTTP ----> Your server
does SSL off-loading |
or SSL termination |
|
<------- Response: Redirect to HTTPS <-
3. Client ---> HTTPS ----> load balancer ----> HTTP ----> Your server
|
<------- Response: Redirect to HTTPS <-
4. Client ---> HTTPS ----> load balancer ----> HTTP ----> Your server
|
<------- Response: Redirect to HTTPS <-
5. Client ---> HTTPS ----> load balancer ----> HTTP ----> Your server
|
<------- Response: Redirect to HTTPS <-
... ad infinitum
A solução é:
- não redirecione para HTTPS do seu servidor web! Faça isso no loadbalancer ou no CDN
-
se você não puder fazer o redirecionamento para HTTPS no loadbalancer / CDN, envie o tráfego que chega sobre http para um servidor de back-end separado e deixe que o servidor faça nada além de redirecionar para HTTPS e você evita o loop e obtém algo como:
1. Client ---> HTTP ----> load balancer ----> HTTP ----> Your redirect server | <------- Response: Redirect to HTTPS <- 2. Client ---> HTTPS ----> load balancer ----> HTTP ----> Your application server | <------- Response: Application data <-
-
possivelmente o loadbalancer / CDN define um cabeçalho com o protocolo original, HTTP ou HTTPS, que o cliente usa e usa a presença / ausência desse cabeçalho como condição para gerar um redirecionamento para HTTPS.
Além disso, observe: um Redirecionamento HTTP 301 == "Movido permanentemente" e, portanto, até mesmo um redirecionamento configurado incorreto será armazenado em cache pelos navegadores da Web (e talvez também pelo CDN e servidores proxy) e depois de ter removido a diretiva de uma configuração do servidor você ainda pode observá-lo. Pode ser necessário testar a partir de uma nova janela do navegador anônima e / ou limpar seus caches.