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">

⚠️ 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

Cancelável

Quando usar cada um

Use meta refresh quando

Use location.href quando

if (!user.isLoggedIn) {
    location.href = '/login';
}

Use location.replace() quando

if (/Android|iPhone/i.test(navigator.userAgent)) {
    location.replace('/mobile/');
}

Impacto no SEO

🚨 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;