Use redirect 301 (ou 308) quando o endereço mudou de vez, e 302 (ou 307) quando a mudança é temporária. O Google trata o redirect permanente como sinal forte de que o destino deve ser a URL canônica e passa a mostrar o endereço novo na busca. No temporário, a URL antiga costuma continuar nos resultados. E nos dois casos o certo é um salto só, direto pra página final.
Redirect 301 ou 302: o que muda pro Google
O código de status diz ao Google se a mudança é definitiva. Na documentação sobre como os códigos de status HTTP afetam os rastreadores do Google, o 301 é um "indicador forte" de que o destino precisa ser processado, e o 302 é um "indicador fraco". Na prática:
- Permanente (301, 308): o Google usa isso como indicador de que o destino deve ser a canônica e mostra o destino nos resultados.
- Temporário (302, 303, 307): a URL de origem costuma continuar na busca. O destino ainda pode ser indexado se outros sinais apontarem pra ele.
O problema clássico é deixar um 302 numa mudança que era definitiva. O Google segue o redirect, mas pode continuar mostrando o endereço antigo.
Tabela: cada tipo de redirect e o que o Google faz
| Tipo | Permanente ou temporário | Quando usar | O que o Google faz |
|---|---|---|---|
| 301 | Permanente | URL mudou de vez, domínio novo, http pra https | Segue e usa como sinal forte de que o destino é a canônica |
| 308 | Permanente | Mesmo caso do 301 (é o padrão do Next.js e da Vercel) | Trata igual ao 301 |
| 302 | Temporário | Manutenção, promoção curta, variação de teste A/B | Segue, mas como sinal fraco; a origem costuma ficar na busca |
| 307 | Temporário | Mesmo caso do 302 | Trata igual ao 302 |
| 303 | Temporário | Resposta a envio de formulário | Trata como temporário |
| meta refresh de 0 segundo | Permanente | Quando você não controla o servidor | Trata como permanente |
| meta refresh com atraso | Temporário | Quase nunca | Trata como temporário |
JavaScript (window.location) |
Permanente | Último recurso | Só enxerga se a renderização da página der certo |
A página oficial Redirecionamentos e Pesquisa Google recomenda redirect do lado do servidor sempre que der. Se não der, meta refresh instantâneo:
<meta http-equiv="refresh" content="0; url=https://www.seusite.com.br/pagina-nova">
JavaScript fica pro caso em que nem isso é possível.
Por que o Next.js e a Vercel usam 307 e 308
Com 301 e 302, muitos navegadores trocam o método da requisição ao seguir o redirect: um POST vira GET. O 307 e o 308 preservam o método. Pro Google não faz diferença: 308 equivale a 301, e 307 equivale a 302. Ver 308 onde você esperava 301 não é problema. Ver 307 numa mudança definitiva é.
Quando usar redirecionamento 301 (e quando não usar)
Use redirect permanente quando:
- a URL de uma página mudou e não vai voltar;
- você juntou duas páginas parecidas numa só;
- o site passou de http pra https, ou escolheu entre www e sem www;
- você mudou de domínio.
Não use 301 quando:
- a página sai do ar por pouco tempo (use 302 ou 307);
- é uma variação de teste A/B;
- a página foi removida e não tem substituta. Aí o certo é 404 ou 410.
Redirect no teste A/B: 302 nas variações
Se o teste manda parte das pessoas pra outra URL, a orientação do Google é usar 302, e não 301, porque o redirect vale só durante o experimento. As variações levam rel="canonical" apontando pra página original, e o teste fica no ar só pelo tempo necessário. Mais detalhes em teste A/B e SEO.
Cadeia de redirecionamento: quantos saltos o Google segue
Por padrão, os rastreadores do Google seguem até 10 saltos de redirecionamento. Mas o próprio guia de migração pede pra redirecionar direto pro destino final e, se não der, manter a cadeia em no máximo três saltos, cinco no limite. Cada salto aumenta a latência, e nem todo navegador consegue seguir cadeias longas.
Cadeia típica, fruto de regras empilhadas com o tempo:
http://seusite.com.br/produto-antigo
301 → https://seusite.com.br/produto-antigo
301 → https://www.seusite.com.br/produto-antigo
301 → https://www.seusite.com.br/produtos/produto-novo
200
Três saltos onde bastava um. Pra resolver:
- Faça cada regra apontar pro endereço final completo, já com https e o host certo. Se o destino mudar de novo, atualize os redirects antigos também.
- Coloque as regras de URLs específicas antes da regra geral de host (veja o exemplo de Apache abaixo).
- Troque links internos, canonical e sitemap pela URL final. Link interno não devia passar por redirect nenhum.
Loop de redirecionamento: por que acontece
Loop é quando A manda pra B e B manda de volta pra A. O navegador desiste com erro de "muitos redirecionamentos", e o Google não chega a página nenhuma. Onde costuma estar o problema:
- www brigando com sem www: o painel da CDN manda pra sem www, e o servidor manda pra www.
- Cloudflare no modo Flexible: a Cloudflare fala com o seu servidor em http, o servidor força https, e a volta nunca termina. A Cloudflare indica subir o modo de criptografia pra Full ou superior.
- Barra no fim: uma regra tira a barra final e outra coloca.
- Parâmetro mal escrito no Next.js: a documentação avisa que esquecer a barra antes dos dois-pontos (
/:slug) faz o caminho virar texto literal e pode causar redirect infinito.
No Search Console, loop e cadeia longa demais aparecem como Erro de redirecionamento no relatório Páginas. O mesmo status cobre URL que passou do tamanho máximo e URL inválido ou vazio na cadeia.
Redirect pra página errada: tudo pra home vira soft 404
Na migração, é tentador mandar tudo que não tem par pra home. O Google pede pra não fazer isso: redirecionar muitas URLs antigas pra um destino irrelevante, como a página inicial, pode confundir quem chega e ser tratado como erro soft 404.
O que fazer em cada caso:
- URL antiga com equivalente: redirect permanente pra página equivalente. Produto vai pra produto, artigo pra artigo.
- Várias páginas antigas que viraram uma só: pode mandar todas pra página consolidada.
- Sem equivalente: deixe responder 404 ou 410.
Vale pro dia a dia também: jogar toda URL inexistente na home é soft 404 (teste no verificador de soft 404). Confira também se o destino responde 200 e se a canonical dele não aponta de volta pra URL antiga, o que contradiz o redirect (veja canonical errada).
Migração de domínio ou de URLs: redirect 1:1
Um roteiro alinhado ao guia oficial de mudanças e migrações de sites:
- Liste as URLs antigas. Sitemap, Search Console, logs e analytics ajudam a não esquecer nenhuma.
- Mapeie cada URL antiga pra nova. Uma planilha com duas colunas: endereço antigo e destino.
- Configure redirect permanente no servidor (301 ou 308), direto pro destino final.
- Sem equivalente, 404 ou 410.
- Atualize links internos, canonical e sitemap e envie o sitemap novo no Search Console.
- Mudou de domínio ou subdomínio? Envie uma Alteração de endereço no Search Console, na propriedade do site antigo. Pra http → https ou www ↔ sem www no mesmo domínio, não precisa.
- Mantenha os redirects pelo maior tempo possível. O Google fala em pelo menos um ano.
O guia avisa que pode haver flutuação temporária no ranking e que, num site de porte médio, a maioria das páginas é movida em algumas semanas. Se o tráfego caiu e não voltou, veja o que fazer quando o site sumiu do Google.
Como configurar o redirect 301 no servidor
nginx
Guarde as URLs que mudaram num arquivo e inclua em todos os blocos. Assim, até quem chega por http e sem www vai pro destino final num salto só.
# /etc/nginx/redirects.conf
location = /produto-antigo {
return 301 https://www.seusite.com.br/produtos/produto-novo;
}
# http (com e sem www) e https sem www
server {
listen 80;
server_name seusite.com.br www.seusite.com.br;
include redirects.conf;
location / { return 301 https://www.seusite.com.br$request_uri; }
}
server {
listen 443 ssl;
server_name seusite.com.br;
# ssl_certificate e ssl_certificate_key aqui
include redirects.conf;
location / { return 301 https://www.seusite.com.br$request_uri; }
}
# no server do www (443), inclua redirects.conf também
Apache (.htaccess)
RewriteEngine On
# 1. URLs que mudaram: direto pro final, já com https e www
RewriteRule ^produto-antigo$ https://www.seusite.com.br/produtos/produto-novo [L,R=301]
# 2. Resto: http ou sem www vai pra https://www num salto só
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.seusite.com.br%{REQUEST_URI} [L,R=301]
A ordem importa: com a regra de host primeiro, http://seusite.com.br/produto-antigo daria dois saltos. Se o site está atrás de uma CDN que fala http com o servidor, %{HTTPS} fica sempre off e isso vira loop. Nesse caso, faça o redirect pra https na CDN.
Next.js (next.config.js)
module.exports = {
async redirects() {
return [
{
source: '/produto-antigo',
destination: '/produtos/produto-novo',
permanent: true, // responde 308
},
]
},
}
Pela documentação do Next.js, permanent: true gera 308 e permanent: false gera 307. Precisa de 301? Use statusCode: 301 no lugar de permanent, nunca os dois. Esses redirects rodam antes das páginas e da pasta /public.
Cuidado com a função redirect() dentro de componentes: ela responde 307, que é temporário. Pra mudança definitiva, use permanentRedirect() (308) ou, melhor, o next.config.js, que age antes da renderização.
Vercel
No vercel.json, a lógica é a mesma, e permanent vale true por padrão (308):
{
"redirects": [
{ "source": "/produto-antigo", "destination": "/produtos/produto-novo", "permanent": true }
]
}
Pra www e sem www, use o painel: Settings, Domains, Edit no domínio de origem e escolha o destino em "Redirect to".
Cloudflare
Pra forçar https, ligue Always Use HTTPS em SSL/TLS, Edge Certificates. Pra outras regras, crie uma Redirect Rule em Rules, Overview. O código padrão é 301, e a opção Preserve query string vem desligada: se seus links carregam parâmetros, ligue.
WordPress e Shopify
- WordPress: quando você troca o slug de um post, o próprio WordPress guarda o slug antigo e redireciona com 301. Pra páginas e outras mudanças, não conte com isso: confira com curl.
- Shopify: os redirecionamentos de URL ficam no admin, na área de menus. Detalhe importante: o redirect só funciona se a URL antiga estiver quebrada (404). Se ela ainda carrega uma página, ele é ignorado.
Como conferir: curl -IL, Inspeção de URL e relatório Páginas
No terminal, com curl -IL
Teste sempre a pior entrada possível: http, sem www, URL antiga.
curl -sSIL http://seusite.com.br/produto-antigo | grep -iE '^(HTTP|location)'
HTTP/1.1 301 Moved Permanently
Location: https://seusite.com.br/produto-antigo
HTTP/2 301
location: https://www.seusite.com.br/produto-antigo
HTTP/2 302
location: https://www.seusite.com.br/produtos/produto-novo
HTTP/2 200
Cada linha HTTP é um salto. Aqui são três, e um deles é 302 numa mudança definitiva: dois problemas pra corrigir. Pra pegar loop, limite os saltos como o Google faz:
curl -sSIL --max-redirs 10 http://seusite.com.br/produto-antigo
Se terminar em curl: (47) Maximum (10) redirects followed, tem loop ou cadeia longa demais. Alguns servidores respondem diferente a HEAD (o -I). Se o resultado parecer estranho, troque por curl -sSL -o /dev/null -D - URL, que faz GET e mostra os cabeçalhos de cada salto.
Sem terminal, o verificador de redirect da Varrida mostra cada salto com o código até a página final e confere se http, https, com e sem www caem no mesmo endereço.
No Search Console: Página com redirecionamento
No relatório de indexação de páginas, dois status importam:
- Página com redirecionamento: a URL redireciona pra outra, então ela própria não é indexada. Pra URL antiga, é o esperado. É problema quando aparece ali uma URL que você quer na busca, ou quando links internos e sitemap ainda apontam pra ela.
- Erro de redirecionamento: loop ou cadeia quebrada. Esse precisa de correção.
Na Inspeção de URL, inspecione a URL nova, não a antiga: o "Testar o URL publicado" segue os redirects sem avisar. Na nova, o "URL canônico selecionado pelo Google" deve ser ela mesma.
Pra ver redirects junto com canonical, sitemap e status das páginas, a auditoria grátis da Varrida mostra os problemas mais graves em menos de 1 minuto, sem cadastro.
Checklist rápido
- Mudança definitiva usa 301 ou 308. 302 e 307 só pro que é temporário, como teste A/B.
- A URL antiga, testada a partir de http e sem www, chega na página final em um salto.
curl -sSIL --max-redirs 10não termina com o erro 47.- Nada de redirect em massa pra home: sem equivalente, 404 ou 410.
- Links internos, canonical e sitemap apontam pra URL final, sem redirect no meio.
- No Next.js, redirect definitivo via
permanent: trueoupermanentRedirect(), nãoredirect(). - Na Cloudflare, Preserve query string ligado quando os parâmetros importam.
- Redirects da migração mantidos por pelo menos um ano.


