Enfoque de diagnóstico: de síntoma a causa raíz
En desarrollo web, los problemas de SEO técnico suelen aparecer como síntomas (caída de tráfico, URLs “extrañas” en el índice, páginas que no se indexan, bucles de redirección) que en realidad provienen de decisiones de implementación: parámetros, reglas de routing, middleware, plantillas, cachés, o despliegues parciales. Esta sección se centra en casos típicos y un método repetible: detectar (crawl, logs, comparaciones), confirmar (pruebas de respuesta/HTML) y corregir/prevenir (convenciones + tests en CI).
Checklist rápido de triage (antes de tocar código)
- ¿Qué cambió? despliegue, reglas de CDN/WAF, cambios en routing, campañas, migraciones, A/B tests.
- ¿Es global o por segmento? solo mobile, solo país, solo categoría, solo parámetros.
- ¿Es rastreo o indexación? el bot llega pero no indexa vs no llega.
- ¿Qué ve el servidor? revisar logs por user-agent, status, tiempo de respuesta, y frecuencia.
1) Contenido duplicado por parámetros, versiones de URL y canonicals inconsistentes
Síntomas típicos
- Muchas URLs similares indexadas (con
?utm_,?sort=,?page=, filtros) que compiten entre sí. - En Search Console aparecen “Duplicada, Google eligió otra canónica” o “Enviada, no indexada” para variantes.
- En el crawl interno aparecen múltiples rutas que devuelven el mismo HTML (o casi igual).
- En logs, Googlebot solicita muchas combinaciones de parámetros con baja profundidad.
Causas frecuentes en desarrollo
- El router acepta múltiples versiones:
/productoy/producto/, mayúsculas,index.html, o rutas alternativas. - Parámetros de tracking o de UI generan URLs rastreables sin control.
- Canonical dinámico mal calculado (incluye parámetros, apunta a otra variante, o cambia según el entorno).
- Plantillas que generan enlaces internos con parámetros (por ejemplo, ordenación por defecto en listados).
Cómo detectarlo
- Crawl: rastrea el sitio permitiendo parámetros y exporta agrupando por “hash de contenido” (mismo
<title>, mismo H1, o similitud alta del HTML). Identifica clusters de URLs equivalentes. - Logs: filtra peticiones de bots a URLs con
?y ordena por frecuencia; detecta combinaciones explosivas (facetas/filtros). - Comparación sitemap vs navegación: lista URLs del sitemap y compáralas con URLs descubiertas por enlaces internos. Si el crawl encuentra muchas URLs fuera del sitemap con contenido equivalente, hay duplicación por rutas/params.
Cómo confirmarlo (pruebas de respuesta/HTML)
- Elige 5–10 pares de URLs sospechosas (con y sin parámetro, con y sin slash, mayúsculas/minúsculas).
- Comprueba el estado HTTP y el destino final (si hay redirecciones) con una petición HEAD/GET.
- Compara el HTML:
<link rel="canonical">,<title>, H1, y bloques principales. Si el contenido es el mismo, confirma duplicado. - Verifica que el canonical sea estable y apunte a la URL preferida (sin parámetros no esenciales, con formato consistente).
# Ejemplos de comprobación rápida (ajusta a tu entorno)curl -I "https://example.com/categoria?utm_source=ads"curl -s "https://example.com/categoria?sort=price" | grep -i canonicalcurl -I "https://example.com/Producto"curl -I "https://example.com/producto/"Pasos de corrección (prácticos)
- Define una URL preferida por tipo de página (producto, categoría, contenido). Documenta: slash sí/no, minúsculas, sin
index.html, sin parámetros de tracking. - Normaliza con redirecciones solo para variantes “técnicas” (slash, mayúsculas,
index.html). Evita redirigir parámetros de funcionalidad si deben existir; en su lugar, controla indexación/canonical. - Canonical consistente: genera el canonical desde la URL normalizada (sin parámetros no esenciales). Asegura que no cambie por A/B, sesión o headers.
- Evita enlazado interno a variantes: en plantillas, construye URLs con helpers que siempre devuelvan la forma canónica.
- Controla facetas: si filtros generan combinaciones infinitas, limita enlaces rastreables (por ejemplo, no enlazar todas las combinaciones) y define qué facetas merecen URL indexable.
Prevención (CI, plantillas y convenciones)
- Test unitario de canonical: para cada plantilla, renderiza y valida que el canonical coincide con la URL normalizada esperada.
- Lint de URLs: helper único para construir enlaces internos; prohíbe concatenación manual de rutas.
- Test de “no parámetros en enlaces internos” (salvo whitelist): parsea HTML en CI y falla si aparecen
utm_o parámetros no permitidos en<a href>. - Snapshot de rutas: lista de rutas válidas y reglas de normalización versionadas (evita que un cambio de router reintroduzca variantes).
2) Páginas huérfanas (sin enlaces internos, solo en campañas)
Síntomas típicos
- Landing pages que reciben tráfico de pago/email pero casi no aparecen en rastreos internos.
- URLs presentes en el sitemap o en campañas, pero no descubiertas por navegación.
- En logs, Googlebot apenas las visita o lo hace muy tarde.
Causas frecuentes en desarrollo
- Landings creadas fuera del CMS principal o en rutas no integradas a la arquitectura.
- Páginas “temporales” que se publican sin enlazado desde categorías o hubs.
- Contenido generado por feature flags: visible para usuarios/campañas, pero no enlazado en el estado por defecto.
Cómo detectarlo
- Crawl: rastrea desde la home siguiendo enlaces. Luego compara con una lista “fuente de verdad” (sitemap, base de datos de páginas publicadas, o export del CMS).
- Comparación sitemap vs navegación: URLs en sitemap pero no encontradas por crawl = candidatas a huérfanas.
- Logs: identifica URLs con tráfico de campañas (referers, parámetros) pero sin visitas de bots o con muy baja frecuencia de rastreo.
Cómo confirmarlo (pruebas de respuesta/HTML)
- Busca enlaces hacia esa URL en el HTML del sitio (puedes hacer una búsqueda en el repositorio o en un dump del crawl).
- Comprueba si existe una ruta de navegación razonable (home → categoría → landing) sin depender de campañas.
- Verifica si la página devuelve 200 y si su contenido es accesible sin interacción (sin depender de formularios o estados).
Pasos de corrección (prácticos)
- Define el “padre” de la landing: una categoría, hub o sección que la contextualice.
- Añade enlaces internos desde páginas relevantes (no solo desde el footer global). Prioriza enlaces en el cuerpo del contenido o módulos relacionados.
- Incluye la landing en listados (si aplica): por ejemplo, “Recursos”, “Promociones”, “Guías”, con paginación controlada.
- Revisa consistencia de navegación en mobile/desktop para evitar que el enlace exista solo en un breakpoint.
Prevención (CI, plantillas y convenciones)
- Regla de publicación: ninguna página se publica sin “parent” o sin al menos N enlaces internos entrantes desde páginas indexables.
- Test de orfandad: job nocturno que cruza “URLs publicadas” vs “URLs descubiertas por crawl” y abre incidencias automáticamente.
- Plantillas de landing con módulo obligatorio de “relacionados” o “volver a” para asegurar enlaces bidireccionales.
3) Redirecciones problemáticas: cadenas, 302 inadvertidos y reglas por patrón incorrectas
Síntomas típicos
- Tiempo de carga mayor por saltos múltiples antes del 200 final.
- En el crawl aparecen rutas con 2–5 redirecciones (o bucles).
- URLs antiguas no consolidan señales porque se quedan en 302 o alternan destinos.
- En logs, muchas peticiones a URLs antiguas terminan en múltiples status antes del 200.
Causas frecuentes en desarrollo
- Reglas en cascada: HTTP→HTTPS, non-www→www, slash, normalización de mayúsculas, y luego redirección de contenido; cada capa añade un salto.
- Uso de 302 por defecto en frameworks/middlewares o en reglas temporales que se “quedan” en producción.
- Reglas por patrón demasiado amplias (regex) que capturan rutas que no deberían y redirigen a destinos genéricos.
- CDN o proxy reescribiendo Location o forzando redirecciones adicionales.
Cómo detectarlo
- Crawl: exporta cadenas de redirección y ordena por longitud. Identifica patrones repetidos (p. ej., siempre 3 saltos).
- Logs: agrupa por URL inicial y cuenta cuántas veces se solicita; cruza con status codes para ver si hay 302 persistentes.
- Comparación sitemap vs navegación: si el sitemap contiene URLs que redirigen, hay un problema de higiene (debería listar destinos finales 200).
Cómo confirmarlo (pruebas de respuesta/HTML)
- Para una URL problemática, sigue redirecciones y registra cada salto (status + Location).
- Verifica si el destino final es el correcto y estable (no varía por cookies, geo, o headers).
- Comprueba si hay 302 donde debería haber 301 (cuando el cambio es permanente).
# Seguir redirecciones y ver cada saltocurl -I -L "https://example.com/antigua"# Ver solo cabeceras de cada respuesta (útil con -v)curl -v -o /dev/null "https://example.com/antigua"Pasos de corrección (prácticos)
- Colapsa normalizaciones en un solo salto: idealmente, una única redirección desde la variante a la URL final (por ejemplo, combinar HTTP→HTTPS + www + slash en una regla coherente).
- Reemplaza 302 por 301 cuando la intención sea permanente. Documenta excepciones (mantenimiento, georedirect temporal, pruebas).
- Revisa reglas por patrón con un set de casos: rutas válidas, inválidas, edge cases (subrutas, querystrings). Evita “catch-all” que mande todo a home.
- Actualiza enlaces internos para apuntar directamente al destino final 200 (no depender de redirecciones internas).
- Sincroniza CDN/proxy: valida que no haya reglas duplicadas entre app y edge.
Prevención (CI, plantillas y convenciones)
- Suite de pruebas de redirecciones: lista versionada de URLs antiguas → destino esperado, status esperado, y “máximo 1 salto”.
- Test de no-redirección en enlaces internos: en CI, toma una muestra de URLs generadas por plantillas y verifica que responden 200 sin saltos.
- Revisión de reglas: cambios en Nginx/Apache/CDN pasan por PR con casos de prueba (fixtures) y validación automática.
4) Páginas que no indexan: noindex accidental, bloqueo, 5xx intermitentes y soft-404
Síntomas típicos
- Páginas importantes no aparecen en resultados pese a estar publicadas y enlazadas.
- Variaciones por entorno: en staging todo bien, en producción no indexa (o al revés).
- En Search Console: “Excluida por etiqueta ‘noindex’”, “Bloqueada”, “Error del servidor (5xx)”, “Soft 404”.
- En logs: picos de 500/502/503 para rutas concretas o en ventanas de tiempo.
Causas frecuentes en desarrollo
- Noindex accidental: bandera de entorno, plantilla reutilizada, o lógica condicional (por ejemplo, noindex si falta un campo, o si el usuario no está logueado).
- Bloqueo: reglas de robots o middleware que devuelve 403/401 a bots, o bloqueos en edge por WAF.
- 5xx intermitentes: timeouts a APIs, pool de DB saturado, despliegues con instancias desincronizadas, caché inconsistente.
- Soft-404: páginas que devuelven 200 pero el contenido es “vacío” (sin producto, sin resultados, “no encontrado” renderizado como HTML normal), o páginas de búsqueda sin resultados tratadas como contenido.
Cómo detectarlo
- Crawl: identifica URLs con meta robots noindex, respuestas 4xx/5xx, y páginas 200 con muy poco contenido o patrones de “no encontrado”.
- Logs: analiza por status y por endpoint; detecta intermitencia (mismo URL alterna 200 y 5xx). Segmenta por user-agent para ver si el bot recibe trato distinto.
- Comparación sitemap vs navegación: URLs en sitemap que devuelven noindex/5xx/soft-404 son señales de fallo de publicación o de pipeline.
Cómo confirmarlo (pruebas de respuesta/HTML)
- Noindex: solicita la URL y busca
noindexen meta robots o cabeceraX-Robots-Tag. - Bloqueo: prueba con distintos user-agents y sin cookies; verifica status y contenido. Si hay 403/401 solo para bots, revisa WAF/middleware.
- 5xx intermitente: repite peticiones en intervalos (o desde varias regiones) y registra status/latencia. Correlaciona con métricas de backend.
- Soft-404: valida si el HTML contiene mensajes de “no encontrado” o plantillas vacías pese a status 200; compara con una página válida del mismo tipo.
# Noindex en HTMLcurl -s "https://example.com/pagina" | grep -iE "meta name=\"robots\"|noindex|nofollow"# Noindex en cabecerascurl -I "https://example.com/pagina" | grep -i "x-robots-tag"# Repetir para detectar intermitenciafor i in {1..10}; do curl -s -o /dev/null -w "%{http_code} %{time_total}\n" "https://example.com/pagina"; sleep 2; donePasos de corrección (prácticos)
- Noindex accidental: localiza la fuente (plantilla, middleware, configuración). Asegura que solo se aplique a páginas explícitamente excluidas. Añade una “lista segura” de tipos de página que nunca deben llevar noindex.
- Bloqueo: revisa reglas de edge/WAF y autenticación. Evita condicionar el acceso a bots por heurísticas frágiles. Si hay geobloqueo, valida impacto en bots.
- 5xx intermitentes: implementa degradación controlada (fallback) para dependencias externas; añade caché; aumenta timeouts de forma razonable; corrige pool/colas. Prioriza estabilidad sobre contenido perfecto.
- Soft-404: cuando un recurso no existe, devuelve 404 real. Si es una página de listado sin resultados, decide si debe existir: o bien 200 con contenido útil (filtros alternativos, enlaces a categorías) o 404/410 si no tiene valor.
Prevención (CI, plantillas y convenciones)
- Tests de “indexabilidad” por plantilla: renderiza páginas representativas y valida ausencia de
noindexy presencia de elementos mínimos (H1, contenido principal). - Monitoreo sintético: checks periódicos a URLs críticas desde varias regiones; alerta si aparece 5xx o sube la latencia.
- Contrato de errores: convención clara: recurso inexistente → 404; recurso retirado → 410; error backend → 5xx; evita “página no encontrada” con 200.
- Gate de despliegue: antes de publicar, smoke test que verifica status 200 en un set de URLs clave y que no hay cabeceras/etiquetas de bloqueo inesperadas.
Tabla de diagnóstico rápido por problema
| Problema | Detección principal | Confirmación | Corrección típica | Prevención |
|---|---|---|---|---|
| Duplicado (params/variantes) | Crawl por similitud + logs con “?” | Comparar HTML + canonical | Normalización + canonical consistente + evitar enlaces a variantes | Tests de canonical y lint de URLs |
| Huérfanas | Sitemap/DB vs crawl desde home | Buscar enlaces entrantes | Integrar en hubs/listados + enlaces contextuales | Regla de publicación + test de orfandad |
| Redirecciones problemáticas | Crawl de cadenas + sitemap con redirects | Seguir saltos y revisar status | Colapsar a 1 salto + 301 correctos + actualizar enlaces | Suite de redirects + test de enlaces 200 |
| No indexan (noindex/bloqueo/5xx/soft-404) | Crawl de noindex/5xx + logs por status | Ver meta/cabeceras + repetición para intermitencia | Eliminar noindex accidental, ajustar edge, estabilizar backend, 404 reales | Smoke tests + monitoreo + contrato de errores |