Guía de redirecciones Meta Refresh y JavaScript

Contenido

Las redirecciones del lado del servidor (301/302) siempre son la primera opción correcta. Pero a veces no puedes modificar la configuración del servidor, o necesitas redirigir según condiciones en tiempo de ejecución — ahí es donde entran las redirecciones del lado del cliente.

Meta refresh HTML

<!-- Redirigir inmediatamente -->
<meta http-equiv="refresh" content="0; url=/new-page.html">

<!-- Redirigir después de 3 segundos -->
<meta http-equiv="refresh" content="3; url=https://newdomain.com">

⚠️ Trampa del botón atrás

Meta refresh agrega la página actual al historial del navegador antes de redirigir. Cuando los usuarios presionan Atrás, aterrizan en la página que redirige y son enviados hacia adelante inmediatamente. Evita este patrón siempre que sea posible.

Métodos de redirección con JavaScript

window.location.href (más común)

// Agrega la página actual al historial — el usuario puede volver
window.location.href = 'https://example.com';

location.replace() (sin entrada en el historial)

// Reemplaza la entrada actual del historial — el usuario no puede volver
location.replace('https://example.com');

location.assign() (igual que href)

location.assign('https://example.com');

window.open() (nueva pestaña)

window.open('https://example.com', '_blank');

Diferencias clave

Entrada en el historial

Cancelable

Cuándo usar cada uno

Usa meta refresh cuando

Usa location.href cuando

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

Usa location.replace() cuando

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

Impacto en SEO

🚨 Importante

Para cualquier cambio permanente de URL, siempre usa una redirección 301 del lado del servidor. Las redirecciones del lado del cliente son solo para escenarios dinámicos en tiempo de ejecución.

Errores comunes

El código después de la redirección sigue ejecutándose

// ❌ El código de abajo sigue ejecutándose
if (needRedirect) { location.href = '/other'; }
doSomethingElse(); // ¡sigue ejecutándose!

// ✅ Usa return
if (needRedirect) { location.href = '/other'; return; }
doSomethingElse();

Bucle de redirección móvil

// ✅ Protección contra re-redirección
if (isMobile && !location.pathname.startsWith('/mobile/')) {
    location.replace('/mobile' + location.pathname);
}

Pérdida de query string

// ❌ Se pierde el query string
location.href = '/new-page';

// ✅ Preservarlo
location.href = '/new-page' + location.search;