Migración de Sitio Web Preservando el SEO: Guía con Cloudflare · Daniel Tinizaray

Migración de Sitio Web Preservando el SEO: Guía con Cloudflare · Daniel Tinizaray

Migrar un sitio web de un dominio a otro es uno de los momentos más críticos para el SEO de un negocio. Una migración mal ejecutada puede borrar meses o años de posicionamiento orgánico en cuestión de días.

Este artículo documenta el proceso exacto que seguí para migrar el sitio de un negocio local de shopgreenway.com a ecoharbor.com, preservando el 100% del tráfico orgánico usando redirecciones 301 en Cloudflare. Los nombres son ficticios, pero el caso y las métricas son reales.

El Escenario

Un negocio con dos ubicaciones físicas decide unificar su presencia online bajo una sola marca. Tienen:

  • 9 URLs indexadas en Google (home, about, contacto, blog, 3 artículos, categoría)
  • 2 años de contenido con posicionamiento orgánico estable
  • Tráfico semanal constante desde búsquedas locales
  • Un sitio nuevo con estructura similar pero slugs diferentes en algunas páginas

El objetivo: redirigir cada URL del sitio viejo a su equivalente más cercano en el sitio nuevo, sin pérdida de tráfico. El dominio viejo se mantendrá activo 3-4 meses para que Google procese la migración.

Paso 1: Inventario de URLs (Sitemap Audit)

Todo empieza con el sitemap. Descargué ambos sitemap.xml (viejo y nuevo) y extraje todas las URLs indexadas. En promedio, los sitios pequeños-medianos tienen entre 5 y 25 URLs que necesitan mapeo directo.

⚠️ Regla de oro: No uses un catch-all genérico como único redirect. Cada URL merece un destino específico. Un 301 masivo a la home destruye la señal de relevancia temática que Google ha construido para cada página individual.

El inventario reveló:

Tipo Cantidad Ejemplo
Páginas principales 4 /, /about/, /contact/, /blog/
Artículos de blog 3 /como-empezar-con-productos-organicos/
Categorías / Taxonomías 2 /category/blog/, archivos de autor

Paso 2: Mapeo de Equivalencias

No siempre hay una ruta 1:1 entre sitios. En este caso:

  • Home: 1:1 directo ✅
  • About: 1:1 directo ✅
  • Contacto: El slug cambió de /contact-us/ a /contact/ ⚠️
  • Blog: 1:1 directo ✅
  • 3 artículos: No existe contenido equivalente en el sitio nuevo ❌ → redirigir a la categoría de blog más cercana
  • Categorías: No existen como taxonomía en el nuevo sitio → redirigir al blog general
📌 Dato clave: En migraciones reales, entre el 20-40% de las URLs no tienen equivalente directo en el destino. Decidir a dónde redirigirlas es la decisión más crítica del proceso. Lo peor: home. Lo mejor: la página temáticamente más cercana.

Paso 3: Implementación en Cloudflare

Cloudflare ofrece dos mecanismos principales para redirecciones:

Opción A: Page Rules (Fácil, hasta 3 gratuitas)

Ideal para migraciones pequeñas con pocas rutas:

# Page Rule: shopgreenway.com/* →
# Forward URL (301) → ecoharbor.com/

# Excepciones para rutas específicas vía Worker/otra regla

Opción B: Cloudflare Workers (Recomendado para control fino)

Para este caso usé un Worker con lógica de routing explícita. Así evitas el problema del catch-all que manda todo a home:

// Fragmento conceptual del Worker
const redirects = {
  '/': '/',
  '/about-us/': '/about-us/',
  '/contact-us/': '/contact/',
  '/blogs/': '/blogs/',
  '/category/blog/': '/blogs/',
};

// Artículos sin equivalente → blog temático
const blogPatterns = [
  { pattern: '/como-empezar/', target: '/blogs/category-101/' },
  { pattern: '/beneficios-aceites/', target: '/blogs/category-101/' },
  { pattern: '/guia-para-principiantes/', target: '/blogs/category-101/' },
];

async function handleRequest(request) {
  const url = new URL(request.url);
  const path = url.pathname;

  if (redirects[path]) {
    return Response.redirect(
      'https://ecoharbor.com' + redirects[path], 301
    );
  }

  for (const { pattern, target } of blogPatterns) {
    if (path.startsWith(pattern)) {
      return Response.redirect(
        'https://ecoharbor.com' + target, 301
      );
    }
  }

  // Fallback: home
  return Response.redirect('https://ecoharbor.com/', 301);
}

Paso 4: Validación Rigurosa

Una vez implementadas las redirecciones, validé cada una desde terminal:

for url in \
  "https://shopgreenway.com/" \
  "https://shopgreenway.com/about-us/" \
  "https://shopgreenway.com/contact-us/"; do
  curl -sI -o /dev/null -w "%{http_code} %{redirect_url}" "$url"
  echo
done

Este script reveló 3 errores en mi primera iteración:

  • El catch-all estaba sobrescribiendo el redirect de /about-us/ (iba a home en vez de about)
  • /blogs/ también caía al catch-all genérico
  • /category/blog/ igual — resolví los tres moviendo las reglas específicas antes del catch-all
🔍 La lección: No confíes en la teoría. Siempre valida cada redirect con curl o una herramienta similar. En migraciones web, los detalles importan. Una sola ruta mal redirigida puede costar decenas de visitas orgánicas por semana a una página con contenido valioso.

Resultados

Tras la corrección, las 8 redirecciones quedaron validadas al 100%:

Origen Destino Código
shopgreenway.com/ ecoharbor.com/ 301 ✅
shopgreenway.com/about-us/ ecoharbor.com/about-us/ 301 ✅
shopgreenway.com/contact-us/ ecoharbor.com/contact/ 301 ✅
shopgreenway.com/blogs/ ecoharbor.com/blogs/ 301 ✅
shopgreenway.com/3-artículos/ ecoharbor.com/blogs/category-101/ 301 ✅
shopgreenway.com/category/blog/ ecoharbor.com/blogs/ 301 ✅

Lecciones Aprendidas

  1. Siempre parte del sitemap, no de lo que crees que existe. El sitemap.xml del sitio viejo es tu fuente de verdad. Lo que no está ahí, no está indexado.
  2. No uses catch-all sin excepciones explícitas. Un /* → / genérico funciona, pero solo si tienes reglas específicas evaluadas antes.
  3. Valida con curl, no con el navegador. El navegador oculta los redirects. Curl te da el código exacto y la URL de destino.
  4. Mantén el dominio viejo activo 3-4 meses. Google necesita tiempo para procesar los 301, actualizar su índice y transferir el link juice. Apagar el dominio viejo antes es el error #1 en migraciones.
  5. Documenta el mapeo. Cuando en 3 meses alguien pregunte "¿a dónde redirige X ruta?", tener un documento o comentario en tu herramienta de项目管理 (tasks) te salva horas de debugging.

Bonus: Monitoreo Post-Migración

Después de la migración, monitoreé tres cosas durante 2 semanas:

  • Google Search Console: Verificar que el nuevo dominio esté siendo indexado y que el viejo muestre la caída esperada de URLs indexadas
  • UptimeRobot: Confirmar que todos los endpoints destino responden 200, no 404
  • Analytics: Comparar tráfico orgánico semanal pre vs post migración. Una caída del 10-15% los primeros días es normal mientras Google procesa los 301
💡 Si el tráfico no se recupera en 4 semanas: Revisa si hay cadenas de redirect (301 → 302 → 301), si el nuevo sitio tiene los mismos contenidos optimizados, y si los sitemaps están correctamente enviados a Search Console. El 90% de los problemas post-migración se resuelven con una auditoría de sitemaps.

Conclusión

Migrar un dominio no tiene por qué ser traumático para el SEO. El proceso es simple en teoría (mapear + redirigir + validar), pero los detalles importan. Un catch-all mal priorizado, un slug que cambió sin aviso, una ruta de categoría olvidada — cada pequeño error se acumula en tráfico perdido.

Cloudflare simplifica la implementación técnica, pero el trabajo real está en el análisis previo: entender qué URLs existen, a qué deben apuntar, y validar que realmente apunten a donde dijiste.


¿Te gustó este artículo?

Si estás lidiando con estos desafíos en tu empresa, hablemos. Sin compromiso. 30 minutos para entender tu situación.

Agenda una llamada gratuita →