PRIVACIDAD

Tus preferencias.

Rechazar no limita el acceso a la web. Cerrar sin guardar conserva tu decisión anterior.

Técnicas · siempre activas

Guardamos únicamente tu elección durante un máximo de 12 meses en este navegador.

Consultar proveedores, duración y transferencias

Metaetiquetas

Meta refresh y http-equiv: cuándo usarlos y cuándo no

Cómo trata Google el meta refresh, qué dice el W3C sobre su accesibilidad, qué valores de http-equiv siguen vivos y cómo migrarlos a una 301.

¿Quieres aplicarlo a tu web?Hablemos
ResumenQué es el meta refresh y cómo funciona
Puntos clave
  • <meta http-equiv="refresh"> redirige o recarga una página desde el navegador, y su equivalente en servidor es la cabecera Refresh.
  • Google lo interpreta como redirección: permanente si es instantáneo (0 segundos) y temporal si tiene retardo. Aun así prefiere una redirección de servidor y deja el meta refresh como alternativa.
  • Con un retardo o una recarga automática, el W3C lo trata como fallo de accesibilidad (técnica F41 de WCAG).
  • De los siete valores de http-equiv que lista MDN, hoy solo tienen sentido práctico content-type y, con cuidado, refresh; set-cookie y x-ua-compatible los navegadores los ignoran.
  • Se detecta con curl y grep sobre el HTML y las cabeceras, y se corrige sustituyéndolo por una 301 en el servidor.
  • En cristofercruz.net no uso ningún http-equiv: solo <meta charset>.

El meta refresh aparece casi siempre por un motivo: alguien necesitaba mover una URL y no tenía acceso al servidor. Funciona, Google lo entiende, y por eso sobrevive en gestores de contenido antiguos, constructores de páginas y migraciones a medias. El problema llega cuando se usa con retardo, se encadena o se confunde con una forma de «refrescar» la página para el SEO.

Este artículo cubre qué hace exactamente la etiqueta, qué dice Google y qué dice el W3C, qué pasa con el resto de valores de http-equiv, cómo localizarla en una auditoría y cómo sustituirla por una redirección de servidor. Donde pone «lo probé» es porque monté un servidor local y miré qué hacía un navegador real.

Etiqueta meta con http-equiv refresh y content 0; url=/nuevo/ dividida en tres partes explicadas, con la cabecera HTTP Refresh equivalente debajo.
Las tres piezas de la etiqueta y su equivalente como cabecera HTTP.

Qué es el meta refresh y cómo funciona

El atributo http-equiv permite que una etiqueta meta haga el papel de una cabecera HTTP. Con el valor refresh, la etiqueta equivale a la cabecera Refresh y tiene dos usos. Según MDN, si content es un entero no negativo, indica los segundos que pasan hasta recargar la página; si ese entero va seguido de ;url= y una URL válida, indica los segundos hasta redirigir a esa dirección.

<!-- Redirección instantánea -->
<meta http-equiv="refresh" content="0; url=https://example.com/nuevo/">

<!-- Redirección tras 5 segundos -->
<meta http-equiv="refresh" content="5; url=https://example.com/nuevo/">

<!-- Recarga de la misma página cada 300 segundos -->
<meta http-equiv="refresh" content="300">

MDN precisa un detalle que se pasa por alto: el temporizador arranca cuando la página está completamente cargada, es decir, después de que se hayan disparado los eventos load y pageshow. Con «0», el navegador salta en cuanto termina de cargar la página.

La cabecera HTTP tiene la misma sintaxis. La documentación de MDN admite tres formas (Refresh: 5, Refresh: 5; url=… y Refresh: 5, url=…), y señala que el prefijo url= no distingue mayúsculas y que es opcional.

Cómo lo trata Google

La documentación de Google sobre redirecciones separa dos casos y los trata como señales distintas. Reproduzco la redacción con exactitud porque muchos artículos la simplifican:

  • Meta refresh instantáneo: «Triggers as soon as the page is loaded in a browser». Google Search lo interpreta como redirección permanente.
  • Meta refresh con retardo: se activa «only after an arbitrary number of seconds set by the site owner». Google Search lo interpreta como redirección temporal.

La distinción importa porque, según la misma página, una redirección permanente hace que se muestre el destino en los resultados y una temporal hace que se siga mostrando la página de origen. Un refresh de 5 segundos que usabas para una URL que se ha movido de forma definitiva le dice a Google justo lo contrario de lo que querías.

Dos tarjetas: meta refresh de 0 segundos interpretado como redirección permanente y meta refresh con retardo interpretado como temporal, y debajo el orden de preferencia de Google.
Lo que dice la documentación de Google: 0 segundos, permanente; retardo, temporal.

Google no lo presenta como primera opción. Pide usar redirecciones de servidor siempre que se pueda y deja el meta refresh para cuando la plataforma no las permita («may be a viable alternative»). Admite la etiqueta en el <head> o la cabecera Refresh enviada con código de servidor, y su ejemplo para esta última es Refresh: 0; url=https://www.example.com/newlocation.

En su lista de metaetiquetas, además, Google incluye refresh como etiqueta soportada y añade que no lo soportan todos los navegadores y que puede confundir al usuario, por lo que recomienda una redirección de servidor, en concreto una 301. Esa lista también soporta Content-Type y charset, y deja fuera meta keywords y los atributos lang, entre otros.

Un caso concreto donde la regla cambia: al pedir el robots.txt, Google no sigue redirecciones lógicas como frames, JavaScript o meta refresh. Ahí solo valen los 3xx de servidor.

Meta refresh frente al resto de redirecciones

Los tipos de redirección se distinguen por dónde se ejecutan y por la señal que mandan. Una redirección de servidor responde con un 3xx y una cabecera Location antes de enviar ningún contenido. El meta refresh responde con un 200 y un documento HTML que luego el navegador interpreta. Esa diferencia es el origen de casi todos sus problemas.

MétodoRespuesta del servidorSeñal para GoogleCuándo tiene sentido
301 o 3083xx con LocationPermanenteSiempre que puedas tocar el servidor
302 o 3073xx con LocationTemporalCambios que van a revertirse
Meta refresh 0 s200 con HTMLPermanentePlataformas sin acceso al servidor
Meta refresh con retardo200 con HTMLTemporalCasi nunca
JavaScript location200 con HTML y scriptDepende de que el renderizado funcioneSolo si no puedes usar ninguna de las dos anteriores

La documentación de Google sobre JavaScript es explícita: úsalo solo si no puedes hacer redirecciones de servidor ni meta refresh, porque si falla el renderizado «Google might never see it». Si tu redirección depende de scripts, el artículo sobre SEO con JavaScript explica qué se pierde cuando el renderizado falla. El orden de preferencia queda así: servidor, meta refresh, JavaScript.

Tabla con cuatro filas: 301 o 308, 302 o 307, meta refresh y JavaScript, con dónde se ejecutan, qué señal envían a Google y su riesgo principal.
Cuatro formas de redirigir y dónde se ejecuta cada una.

Lo que probé: cómo se comporta en un navegador real

Para no basarme solo en lo que dicen otros, monté un nginx local con varias páginas de prueba y las abrí con Chromium automatizado, midiendo cuándo cambiaba la URL. Es una prueba de comportamiento del navegador; no dice nada sobre cómo lo procesa Googlebot.

CasoResultado en Chromium
content="0; url=/nuevo/"Navega a /nuevo/ a los 0,0 s
content="5; url=/nuevo/"Navega a /nuevo/ a los 5,0 s
Cabecera Refresh: 0; url=/nuevo/ (nginx, sin HTML)Navega a /nuevo/ a los 0,0 s
content="0; /nuevo/" (sin url=)También redirige
Dos páginas encadenadas, cada una con su refresh de 0 sLlega al destino final tras pasar por las dos
Meta refresh dentro de <noscript>, con JavaScript activoNo redirige

Dos conclusiones prácticas. La primera: aunque Chromium tolere un content sin url=, no tiene sentido depender de ello; escribe el formato completo que documenta Google. La segunda: la cabecera Refresh funciona sin una sola línea de HTML, lo que significa que una redirección de este tipo puede estar escondida en el servidor y no aparecer al ver el código fuente. Por eso la auditoría tiene que mirar las dos capas.

No probé la recarga automática (content="30") durante un ciclo completo, y tampoco he comprobado cómo se comportan Safari o Firefox.

Accesibilidad: lo que dice el W3C

El criterio de éxito 2.2.1 (Tiempo ajustable) de WCAG exige que, cuando el contenido fija un límite de tiempo, el usuario pueda desactivarlo, ajustarlo o ampliarlo, con algunas excepciones. El meta refresh con retardo cae de lleno en ese terreno, y el W3C lo recoge en varias técnicas de fallo:

  • F41: fallo de los criterios 2.2.1, 2.2.4 y 3.2.5 por usar meta refresh para recargar la página. Su procedimiento de prueba marca los valores de segundos menores que 1 o mayores que 72.000, y pregunta si el usuario puede desactivar, ampliar o ajustar el tiempo.
  • F40: fallo por redirección meta con límite de tiempo.
  • F58: fallo por redirección de servidor con límite de tiempo.

La página de WCAG explica la razón con un ejemplo: si el intervalo es demasiado corto y no hay forma de apagar la recarga, las personas ciegas no tienen tiempo de que su lector de pantalla lea la página. MDN lo resume igual: quien navega con tecnología asistiva puede no llegar a leer el contenido antes de que lo redirijan, y los cambios abruptos pueden desorientar a personas con baja visión.

Cuatro tarjetas con el criterio 2.2.1 de WCAG y los fallos F41, F40 y F58 y la técnica H76, más una barra que indica que los 3xx de servidor no cuentan.
Criterio y técnicas del W3C relacionadas con el refresh.

Hay una matización que casi nadie cuenta. La técnica H76 del W3C describe precisamente el refresh de 0 segundos como redirección en cliente «sin confundir al usuario», aclara que no es obligatoria para cumplir WCAG y añade que las redirecciones se implementan preferiblemente en el servidor. Además, la página de WCAG indica que las redirecciones de servidor sin temporizador (los 3xx) no aplican porque no hay límite de tiempo. Lo que sí es un problema documentado es el retardo y la recarga periódica. El refresh de 0 segundos es tolerado, pero no es lo recomendado.

La recarga automática de página: por qué evitarla

Una etiqueta content="60" sin URL recarga la página cada minuto. Se usó mucho en paneles, marcadores deportivos y portadas de noticias. Hay tres razones para sacarla de una web que vive del SEO:

  • Entra de lleno en el fallo F41: recarga sin que el usuario controle el tiempo.
  • Pierde la posición de scroll, el foco y lo que el usuario estuviera escribiendo.
  • Google no documenta ningún beneficio de que una página se recargue sola; ninguna de las fuentes oficiales que he leído lo sugiere. Una frase como «refrescar la página mejora el posicionamiento» no tiene respaldo en la documentación.

Si el contenido tiene que actualizarse, lo habitual es pedir los datos nuevos con JavaScript (fetch) y actualizar solo la parte que cambia, con un control para pausar si la actualización es visible. Eso es un diseño de aplicación, no una etiqueta meta, y queda fuera de este artículo.

Otros valores de http-equiv: cuáles siguen vivos

MDN lista siete valores de http-equiv. La página no usa las palabras «obsoleto» ni «deprecado», pero sí avisa de varios que los navegadores ya no procesan y de uno que no debes usar como medida de seguridad.

ValorQué dice MDNQué dice Google
refreshRecarga o redirige tras N segundos; riesgos de accesibilidadSoportado; prefiere una 301 de servidor
content-typeValor listado por MDNSoportado (junto con charset): define tipo de contenido y codificación; recomienda UTF-8
content-language«Use the lang attribute instead»No aparece como soportado; los atributos lang tampoco se usan, porque detecta el idioma por el texto
content-security-policyAdvierte de no usar meta para otras cabeceras de seguridad por el falso sentido de seguridadNo aparece en su lista
set-cookieLos navegadores lo ignoran yaNo aparece en su lista
x-ua-compatiblePara versiones antiguas de Internet Explorer; los agentes de usuario lo ignoranNo aparece en su lista
default-styleValor listado por MDN; sin relación con SEONo aparece en su lista

Dos aclaraciones para no pasarse de frenada. Que un valor no aparezca en la lista de Google no demuestra que Google lo penalice: Google dice que ignora las metaetiquetas que no soporta. Y la regla de MDN sobre la política de seguridad es una advertencia general («Do not set other security headers using <meta http-equiv=»), no un listado de directivas que funcionen o no. Si necesitas CSP, envíala como cabecera HTTP.

En cuanto a content-type, Google recomienda Unicode/UTF-8 donde sea posible. La forma corta, <meta charset="utf-8">, es la que uso yo.

Lista de los siete valores de http-equiv: refresh, content-type, content-language, content-security-policy, set-cookie, x-ua-compatible y default-style, cada uno con una etiqueta de estado.
Los siete valores que lista MDN y qué conviene hacer con cada uno.

Errores típicos

Cadenas y bucles

Una URL con refresh que apunta a otra con refresh es una cadena. En mi prueba, el navegador resolvió dos saltos de 0 s sin problema, y esa comodidad es la trampa: el usuario no lo nota y se queda sin auditar. Con retardos, cada salto suma segundos de espera. Y si dos páginas se apuntan entre sí, hay un bucle. En un rastreo, una cadena se ve en el informe de redirecciones solo si el rastreador interpreta el meta refresh; compruébalo antes de fiarte.

Refresh en una página que responde 404

Si una URL devuelve un código 404 y además lleva un meta refresh, estás enviando dos señales contradictorias: «no existe» y «se ha movido». Resuélvelo en el servidor con una 301 al destino o con un 404 limpio, según corresponda. Los códigos de respuesta del servidor son la capa que tiene que decir la verdad; el HTML no debería contradecirla.

Refresh que contradice el canonical

Si una página redirige con meta refresh a una URL y su etiqueta canonical señala otra, el rastreador recibe señales cruzadas. Google dice que usa ciertas redirecciones como señal de que el destino debe ser el canónico, así que el destino del refresh y el canonical tienen que coincidir.

Otros fallos

  • Dentro de <noscript>: en mi prueba, con JavaScript activo el navegador no redirigió. Qué hace Googlebot con eso no está documentado y no lo he verificado.
  • Retardo «para que el usuario lea el aviso»: para Google eso es una redirección temporal. Si el cambio es definitivo, estás mandando la señal contraria.
  • URLs relativas con rutas mal escritas: un destino que no existe termina en un 404 tras haber pasado por un 200.
Seis tarjetas numeradas con errores de meta refresh: cadenas, bucles, refresh en una 404, retardo de 5 segundos, dentro de noscript y recarga automática.
Seis fallos que se localizan revisando HTML y cabeceras.

Cómo lo trato en mi web

Busqué http-equiv y refresh en todo el código de cristofercruz.net (plantillas, cabeceras, la página 404, las plantillas legacy y los artículos del blog, salvo este) y esto es lo que hay:

  • No uso ninguna etiqueta <meta http-equiv>. Las plantillas includes/header.php y includes/legacy/header.php declaran la codificación con <meta charset="utf-8">.
  • No hay cabecera Refresh en el código PHP ni en el .htaccess.
  • La única redirección propia del código es la del formulario: send.php responde con un Location y un código 303 tras enviar. Es una redirección de servidor.
  • La página 404 (404.php) fija ella misma el código con http_response_code(404) y no redirige a ninguna parte.
  • La política de seguridad de send.php se envía como cabecera HTTP Content-Security-Policy, no como meta.

En mi servidor local de PHP, la respuesta de una página del blog llega con Content-type: text/html; charset=UTF-8 en las cabeceras. No he comprobado aquí la cabecera que envía el servidor de producción, así que no puedo asegurar que sea la misma.

Cómo detectarlo en una auditoría

La revisión necesita dos pasadas, porque el refresh puede estar en el HTML o en las cabeceras. Estos comandos los probé contra mis páginas de prueba.

# 1) Meta refresh en el HTML (sin renderizar)
curl -s https://tu-dominio.com/pagina/ | grep -oiE '<meta[^>]+http-equiv=["'\'']?refresh[^>]*>'

# 2) Cabecera Refresh enviada por el servidor
curl -sI https://tu-dominio.com/pagina/ | grep -i '^refresh'

Con mi página de prueba, el primer comando devolvió <meta http-equiv="refresh" content="0; url=/nuevo/"> y el segundo, Refresh: 0; url=/nuevo/. Para un sitio entero no vas a lanzar curl URL a URL; usa la búsqueda personalizada de tu rastreador con http-equiv y vuelca el resultado a una hoja con URL de origen, valor de content y destino.

  1. Rastrea el sitio y extrae todas las apariciones de http-equiv="refresh".
  2. Pasa el listado por curl -sI para pillar también las cabeceras.
  3. Clasifica cada caso: 0 s o retardo, destino con 200 o con error, cadenas.
  4. Comprueba si el destino coincide con el canonical y con lo que hay en el sitemap.
  5. Compara el HTML crudo con el renderizado para ver si hay refresh que solo aparecen tras ejecutar JavaScript.
Cuatro pasos de auditoría: HTML crudo con curl y grep, cabeceras con curl -sI, rastreo masivo con búsqueda personalizada e inspección del HTML renderizado.
Cuatro puntos de revisión: HTML crudo, cabeceras, rastreo masivo y renderizado.

Cómo migrarlo a una redirección 301

Cada meta refresh que localices puede sustituirse por una regla de servidor que devuelva 301 al mismo destino. Probé estas dos reglas en un Apache y un nginx locales y ambas devolvieron el 301 con Location al destino. Las probé en la configuración del servidor; en un .htaccess la sintaxis de Apache es la misma, pero no la probé ahí.

# Apache (mod_alias)
Redirect 301 /viejo.html /nuevo/

# Apache (mod_rewrite)
RewriteEngine On
RewriteRule ^/viejo\.html$ /nuevo/ [R=301,L]

# nginx
location = /viejo.html { return 301 /nuevo/; }

En una regla de RewriteRule dentro de un .htaccess, el patrón se escribe sin la barra inicial, así que no copies tal cual la versión de configuración de servidor. Para más variantes, tienes el artículo sobre redirecciones en .htaccess.

  1. Crea la regla 301 en el servidor y pruébala con curl -s -o /dev/null -w '%{http_code} %{redirect_url}\n'.
  2. Quita la etiqueta meta refresh de la página antigua, o elimina la página si ya no hace falta.
  3. Actualiza los enlaces internos y el sitemap para que apunten al destino final, sin pasar por la URL antigua.
  4. Vuelve a rastrear y confirma que no quedan cadenas.

Si el refresh viene de una migración grande, la lista de URLs, el mapa de redirecciones y la verificación posterior son parte del trabajo de una migración SEO.

Si de verdad no puedes tocar el servidor, usa el meta refresh de 0 segundos con la URL completa (como en el ejemplo de Google), mantén un enlace visible al destino dentro de la página y evita cualquier retardo.

Comparación de una URL que responde 200 con meta refresh frente a la misma URL con 301 y cabecera Location, con cuatro pasos de migración debajo.
Antes, un 200 con una etiqueta; después, un 301 con Location.
Auditoría SEO

Ver auditoría SEO

Preguntas frecuentes

¿Google sigue un meta refresh?

Sí. Su documentación de redirecciones lo trata como redirección: permanente si es instantáneo y temporal si tiene retardo. Aun así recomienda las redirecciones de servidor.

¿Pasa un meta refresh la misma señal que una 301?

Google solo dice que interpreta el refresh instantáneo como redirección permanente. No he encontrado una declaración de que sean equivalentes en todos los casos, así que si puedes elegir, elige la 301.

¿Es mejor un refresh de 0 segundos o de 5?

0. Con retardo, Google lo interpreta como temporal y además cae en los fallos de accesibilidad del W3C. Si el cambio es definitivo, no hay motivo para esperar.

¿Sirve content-language para indicar el idioma a Google?

No hay constancia en su documentación. Google dice que detecta el idioma a partir del texto y no usa los atributos lang. Para versiones por idioma está hreflang, que tiene su propio artículo en este blog.

¿Puedo poner Content-Security-Policy con una etiqueta meta?

MDN lo lista como valor de http-equiv, pero avisa de no usar meta para otras cabeceras de seguridad. Si puedes, envíala como cabecera HTTP.

¿Cómo sé si mi web tiene meta refresh?

Busca http-equiv en el código fuente y mira la cabecera Refresh con curl -I. En sitios grandes, usa la búsqueda personalizada de tu rastreador.

¿Un meta refresh dentro de noscript sirve para algo?

En mi prueba con JavaScript activo no redirigió. Qué hace Googlebot con él no está documentado y no lo he verificado.

Referencias y fuentes

Documentación consultada para este artículo.

  1. Redirects and Google Search Google Search Central
  2. Metaetiquetas que Google admite Google Search Central
  3. <meta http-equiv> MDN Web Docs
  4. Refresh header MDN Web Docs
  5. Understanding SC 2.2.1: Timing Adjustable W3C WAI
  6. F41: Failure due to using meta refresh to reload the page W3C WAI
  7. H76: Using meta refresh to create an instant client-side redirect W3C WAI
  8. Cómo aplicar la meta http-equiv refresh en el SEO Carlos Sánchez

Sigue leyendo

Servidores

· 14 min

Redirecciones SEO: tipos 301, 302, 307 y 308 según Google

Tipos de redirecciones, qué documenta Google de cada una, cadenas, 410 frente a 301 y cómo las trato y audito en mi propia web.

Leer el artículo: Redirecciones SEO: tipos 301, 302, 307 y 308 según Google
Servidores

· 15 min

Redirecciones .htaccess: guía con ejemplos probados en Apache

Redirect o RewriteRule, flags, https y www, bucles y rendimiento: ejemplos probados en Apache con el resultado de curl, y qué hay en el .htaccess de mi web.

Leer el artículo: Redirecciones .htaccess: guía con ejemplos probados en Apache
Servidores

· 15 min

Códigos de estado HTTP para SEO: guía de referencia

Qué hace Google con cada código de estado HTTP (200, 301, 304, 404, 429, 503), cómo comprobarlos y qué devuelve en realidad mi propia web.

Leer el artículo: Códigos de estado HTTP para SEO: guía de referencia

Tu próximo paso empieza con una conversación.

Cuéntame qué necesitas conseguir con tu web.

Hablemos de tu proyecto