Guia de redirecionamentos Meta Refresh e JavaScript
Conteúdo
Redirecionamentos do lado do servidor (301/302) são sempre a primeira escolha correta. Mas às vezes você não pode mexer na configuração do servidor, ou precisa redirecionar com base em condições em tempo de execução — é aí que entram os redirecionamentos do lado do cliente.
Meta refresh HTML
<!-- Redirecionar imediatamente -->
<meta http-equiv="refresh" content="0; url=/new-page.html">
<!-- Redirecionar após 3 segundos -->
<meta http-equiv="refresh" content="3; url=https://newdomain.com">
- ✅ Funciona sem JavaScript
- ✅ Uma única linha de HTML
- ❌ Não pode ser cancelado depois que a página carrega
- ❌ Cria uma armadilha do botão voltar (a página redireciona novamente ao voltar)
- ❌ Ruim para SEO — o Google desaconselha
⚠️ Armadilha do botão voltar
O meta refresh adiciona a página atual ao histórico do navegador antes de redirecionar. Quando os usuários clicam em Voltar, eles caem na página que redireciona e são enviados para frente imediatamente. Evite esse padrão sempre que possível.
Métodos de redirecionamento com JavaScript
window.location.href (mais comum)
// Adiciona a página atual ao histórico — o usuário pode voltar
window.location.href = 'https://example.com';
location.replace() (sem entrada no histórico)
// Substitui a entrada atual do histórico — o usuário não pode voltar
location.replace('https://example.com');
location.assign() (igual ao href)
location.assign('https://example.com');
window.open() (nova aba)
window.open('https://example.com', '_blank');
Diferenças principais
Entrada no histórico
- Adiciona entrada ao histórico:
location.href,location.assign(), meta refresh - Sem entrada no histórico:
location.replace()
Cancelável
- Pode ser cancelado: JavaScript (use
clearTimeout) - Não pode ser cancelado: meta refresh
Quando usar cada um
Use meta refresh quando
- Você tem uma página HTML estática sem JavaScript
- Precisa de um aviso de "a página foi movida" com contagem regressiva
Use location.href quando
- Precisa de lógica de redirecionamento condicional
- Quer que o usuário possa voltar
if (!user.isLoggedIn) {
location.href = '/login';
}
Use location.replace() quando
- Após o login — não deixe os usuários voltarem para a página de login
- Redirecionamento automático de página de erro
- Redirecionamento por detecção de mobile/desktop
if (/Android|iPhone/i.test(navigator.userAgent)) {
location.replace('/mobile/');
}
Impacto no SEO
- Meta refresh — o Google desaconselha oficialmente; pode causar perda de ranqueamento
- Redirecionamentos JavaScript — o Google consegue segui-los, mas o processamento é mais lento que redirecionamentos do lado do servidor
- Nenhum carrega códigos de status HTTP — os mecanismos de busca não conseguem determinar se a mudança é permanente ou temporária
🚨 Importante
Para qualquer mudança permanente de URL, sempre use um redirecionamento 301 do lado do servidor. Redirecionamentos do lado do cliente são apenas para cenários dinâmicos em tempo de execução.
Erros comuns
O código após o redirecionamento continua executando
// ❌ O código abaixo continua executando
if (needRedirect) { location.href = '/other'; }
doSomethingElse(); // continua executando!
// ✅ Use return
if (needRedirect) { location.href = '/other'; return; }
doSomethingElse();
Loop de redirecionamento mobile
// ✅ Proteção contra re-redirecionamento
if (isMobile && !location.pathname.startsWith('/mobile/')) {
location.replace('/mobile' + location.pathname);
}
Perda de query string
// ❌ Query string perdida
location.href = '/new-page';
// ✅ Preservá-la
location.href = '/new-page' + location.search;