Códigos de status de redirecionamento 3xx
Um código de status 3xx é um redirecionamento: o recurso que você pediu está em outro lugar, e o cabeçalho Location da resposta diz onde. O código específico diz ao cliente, e a todo buscador, se a mudança é permanente ou temporária e se o método da requisição original precisa ser preservado.
Como um redirecionamento funciona
Um redirecionamento são duas requisições, não uma. O cliente pede a URL A, o servidor responde com um status 3xx e um cabeçalho Location nomeando a URL B, e o cliente então faz uma requisição nova para B. Os navegadores seguem isso automaticamente, então um visitante vê só a página final e a URL final na barra de endereço. A resposta intermediária ainda custa uma ida e volta completa, e é por isso que cadeias longas de redirecionamento são lentas.
Duas propriedades separam os códigos 3xx uns dos outros. A primeira é permanência: um redirecionamento permanente diz a clientes e rastreadores que a URL antiga está aposentada e a nova deveria substituí-la em favoritos, links e índices, enquanto um redirecionamento temporário diz que a URL antiga ainda é a real e vai voltar. A segunda é preservação de método. Os códigos mais antigos permitem que um cliente transforme um POST em GET ao seguir o redirecionamento, e os mais novos proíbem isso, então um POST continua sendo um POST. Essa é a diferença entre um envio de formulário chegando intacto na nova URL e um chegando como um GET vazio.
Todo código 3xx e o que significa
- 300 Multiple Choices. O recurso existe em várias representações e o servidor está deixando o cliente escolher. Não há um formato padrão legível por máquina para a lista, então quase nada implementa isso. Na prática você não vai ver um 300 por aí. Veja o guia de 300 Multiple Choices para o motivo de ele sobreviver principalmente como um termo de busca.
- 301 Moved Permanently. O recurso tem uma nova casa permanente. Os buscadores transferem os sinais de ranqueamento para o alvo, e os clientes têm permissão para guardar o redirecionamento em cache, às vezes agressivamente. Esse é o código para uma mudança de domínio, uma migração de HTTP para HTTPS ou uma reestruturação permanente de URL.
- 302 Found. Um redirecionamento temporário. A URL original mantém a identidade dela, então os buscadores normalmente continuam indexando a original em vez do alvo. Historicamente muitos clientes trocavam o método para GET ao seguir um 302, e é por isso que o padrão avisa contra depender da preservação de método aqui.
- 303 See Other. "Sua requisição foi processada; agora vá e faça GET nesse outro recurso." O cliente é explicitamente instruído a usar GET para a requisição seguinte, independentemente do método original. Essa é a resposta correta para um POST de formulário que deveria chegar a uma página de resultado.
- 304 Not Modified. Não é um redirecionamento de forma alguma. Ele responde a uma requisição condicional e significa "sua cópia em cache ainda está atual, reutilize-a". Não há corpo e não há
Location. Veja 304 Not Modified. - 305 Use Proxy e 306 estão obsoletos. O 305 foi descontinuado por motivos de segurança e o 306 não é usado. Ignore os dois.
- 307 Temporary Redirect. Mesmo significado do 302, mas o método e o corpo precisam ser preservados. Um POST que segue um 307 chega na nova URL como um POST.
- 308 Permanent Redirect. Mesmo significado do 301, mas o método e o corpo precisam ser preservados.
O que dá errado com redirecionamentos
- Um código temporário em uma mudança permanente. O erro mais comum e mais caro. Os buscadores continuam com a URL antiga indexada e a nova não herda a posição da antiga.
- Um código permanente em uma mudança temporária. Mais difícil de desfazer, porque um 301 em cache pode continuar enviando visitantes recorrentes para o lugar errado muito depois de você remover a regra.
- Cadeias de redirecionamento. http para https, depois sem-www para www, depois caminho antigo para caminho novo são três idas e voltas antes de qualquer conteúdo chegar. Cada salto adiciona latência e cada salto é um lugar onde a cadeia pode quebrar.
- Loops de redirecionamento. A envia para B e B envia de volta para A, geralmente porque uma regra no nível da aplicação e uma regra no nível do servidor ou da CDN discordam sobre a forma canônica. Os navegadores desistem depois de um número fixo de saltos e mostram um erro.
- Tudo apontado para a página inicial. Quando páginas aposentadas todas redirecionam para a raiz em vez do equivalente mais próximo, o redirecionamento costuma ser tratado como um soft 404 e o visitante fica procurando.
- Corpos de POST perdidos. Um endpoint de API ou formulário movido atrás de um 301 ou 302 pode perder o método e o payload com alguns clientes. Use 307 ou 308 para qualquer coisa que não seja um GET simples.
Como auditar e corrigir os seus redirecionamentos
- Veja o que uma URL devolve, sem seguir:
Isso imprime a linha de status e o alvo de uma vez.curl -sI https://example.com/old-page | grep -Ei "^(HTTP|location)" - Agora siga a cadeia inteira e conte os saltos:
curl -sIL -o /dev/null -w "%{num_redirects} hops, final %{http_code}, %{url_effective}\n" https://example.com/old-page - Reduza cadeias a um salto. Aponte a URL original diretamente para o destino final em vez de deixá-la passar por regras intermediárias.
- Combine o código com a intenção. Mudança permanente: 301, ou 308 se o endpoint aceita requisições não-GET. Mudança temporária, página de manutenção ou divisão A/B: 302, ou 307 onde o método precisa sobreviver. Fluxo de post-depois-redirecionar: 303.
- Corrija loops decidindo a forma canônica uma vez (protocolo, host e barra final) e aplicando isso em exatamente uma camada. Loops quase sempre significam que duas camadas estão tentando ser autoritativas ao mesmo tempo.
- Teste de novo com o cache limpo. Um navegador que guardou um 301 em cache vai continuar obedecendo a ele, então verifique com curl ou uma janela anônima antes de concluir que a correção não funcionou.
Pegando um redirecionamento quebrado antes de o tráfego cair
Redirecionamentos quebram sem nenhum sintoma visível. Uma regra que começa a fazer loop, ou um certificado que falha no alvo do redirecionamento, ainda deixa a URL antiga respondendo, então nada parece errado até o tráfego e os ranqueamentos caírem. Uma verificação externa que segue a cadeia e faz asserção sobre o status final pega um redirecionamento quebrado no momento em que aparece, e verificar a partir de várias redes separa uma mudança de regra global de um problema regional de CDN. A HostTracker roda verificações a partir de mais de 300 pontos de verificação em 158 cidades e alerta por e-mail, SMS, chamada de voz, Slack, Telegram e mais. Teste uma URL e a cadeia de redirecionamento dela com a ferramenta de verificação HTTP, e leia 301 vs 302 antes de escolher um código.