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.
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
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
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
- 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.
- No uses catch-all sin excepciones explícitas. Un
/* → /genérico funciona, pero solo si tienes reglas específicas evaluadas antes. - Valida con curl, no con el navegador. El navegador oculta los redirects. Curl te da el código exacto y la URL de destino.
- 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.
- 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
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.