Evitando o Loop de Redirecionamento no Ghost com CloudFront

Se você está utilizando o Ghost como plataforma de blog e decidiu colocá-lo atrás de um proxy reverso como o Amazon CloudFront, possivelmente encontrará um problema comum e bastante recorrente: o loop de redirecionamento. Esse erro, geralmente identificado como “ERR_TOO_MANY_REDIRECTS” no navegador, ocorre quando há um conflito na forma como o Ghost interpreta o protocolo da requisição (HTTP ou HTTPS).
Este artigo explica por que esse problema ocorre, como diagnosticá-lo e quais ajustes são necessários para garantir o funcionamento correto da aplicação.
Importante: Essa "necessidade" não é específica do Ghost; ela é uma atenção que você deve ter com qualquer aplicação web que esteja por trás de um proxy reverso, como um CDN, um balanceador de carga, ou até mesmo um servidor Nginx ou Apache.
O que causa o loop de redirecionamento?
O Ghost depende do cabeçalho X-Forwarded-Proto para saber se a requisição original foi feita via HTTPS. Quando esse cabeçalho não é enviado corretamente pelo CloudFront, o Ghost assume que está recebendo HTTP e tenta redirecionar para HTTPS — mesmo que o CloudFront já esteja servindo conteúdo seguro. Isso gera um ciclo de redirecionamentos que impede o carregamento do site.
Considere que por padrão, o Ghost é configurado para funcionar com SSL (HTTPS). Portanto, quando um usuário acessa seu blog via HTTPS, o Ghost espera que a requisição chegue com essa informação.
Em um cenário com um CDN, o fluxo seria o seguinte:
- O usuário acessa seu site usando HTTPS (ex: https://meublog.com.br).
- Essa requisição HTTPS chega ao CDN (CloudFront).
- O CloudFront, para buscar o conteúdo, faz uma nova requisição para o seu servidor Ghost. Essa comunicação entre o CloudFront e o seu servidor pode ser HTTP ou HTTPS, dependendo de como você a configurou no CloudFront.
O problema ocorre se o CloudFront se comunicar com o servidor Ghost via HTTP. O Ghost, ao receber a requisição via HTTP, pensa "Tem algo errado aqui, essa requisição deveria ser HTTPS" e tenta redirecionar o usuário para a versão HTTPS do site, que na verdade é ele mesmo. O CloudFront recebe esse redirecionamento e faz uma nova requisição, mas novamente via HTTP, e o Ghost redireciona de novo. Isso cria um loop infinito de redirecionamento que o usuário final percebe como um erro.
Como identificar o problema
O sintoma mais comum é o navegador exibir:
ERR_TOO_MANY_REDIRECTS
De maneira rápida, também é possível confirmar o comportamento usando o comando:
curl -I https://seusite.com.br
Nesse caso, se houver múltiplos redirecionamentos, o problema está presente!
A Solução: X-Forwarded-Proto e X-Forwarded-For
Para resolver isso, você precisa instruir o CloudFront a repassar para o seu servidor Ghost a informação de que a requisição original do usuário era HTTPS. Isso é feito através dos cabeçalhos X-Forwarded-Proto e, para informações de IP, X-Forwarded-For.
- X-Forwarded-Proto: Este cabeçalho informa ao Ghost qual era o protocolo original da requisição do usuário (neste caso, https). O Ghost, ao ler esse cabeçalho, entende que a requisição já chegou de forma segura, mesmo que a comunicação entre o CloudFront e ele seja HTTP, e não tenta fazer o redirecionamento.
- X-Forwarded-For: Este cabeçalho é crucial para que o Ghost saiba o endereço IP real do usuário. Sem ele, o Ghost veria apenas o IP do CloudFront como a origem de todas as requisições.
O que configurar no CloudFront
Para garantir que tudo funcione, você precisa configurar o Comportamento de Cache (Cache Behavior) no CloudFront para que ele inclua esses cabeçalhos na requisição que ele faz para o seu servidor de origem (em nosso exemplo, o servidor onde o Ghost está rodando).
Na configuração da sua distribuição do CloudFront, vá para a aba Behaviors (Comportamentos) e edite a regra para o seu blog. Em Cache key and origin requests (Chave de cache e requisições de origem), você precisará:
- Escolher a opção Cache policy and origin request policy.
- Na seção Origin request policy, você deve criar uma nova política ou usar uma existente que inclua os cabeçalhos X-Forwarded-Proto e X-Forwarded-For.
Configurar o proxy local (se aplicável)
Acesse o arquivo de configuração de seu webserver e inclua a informação a seguir:
Nginx:
proxy_set_header X-Forwarded-Proto $scheme;
Apache:
RequestHeader set X-Forwarded-Proto "https"
Verifique também o arquivo config.production.json do Ghost e certifique-se de que o campo url está com HTTPS:
{
"url": "https://seusite.com"
}
Resumindo
Essa é uma configuração fundamental de arquitetura de rede, e não de uma aplicação específica. A necessidade de repassar os cabeçalhos X-Forwarded-Proto e X-Forwarded-For é um padrão a fim de garantir que aplicações web funcionem corretamente por trás de proxies reversos, esteja você usando Ghost, WordPress, Drupal, ou qualquer outro CMS ou framework.