Separar caché de origen
Comparé las cabeceras de una respuesta cacheada (HIT, 200) y de una no cacheada (MISS, 404). El origen estaba roto; la caché lo tapaba.
Desde fuera todo respondía 200. Pero cualquier petición sin caché —otra región, un usuario nuevo o Googlebot— recibía un 404. Lo diagnostiqué leyendo cabeceras y lo arreglé sin convertir un fallo invisible en uno visible para todos.
El sitio usa tipos de contenido personalizados con archivo propio: casos de cliente, integraciones y partners. Son páginas con mucho tráfico orgánico y enlazado interno.
Todo va detrás de una caché de página en el hosting y un CDN. Días después de un deploy, una comprobación rutinaria de esas URLs dio resultados distintos según desde dónde se pidieran.
Lo que parecía obvio y no era. Descartar bien ahorra días de trabajo en la dirección equivocada.
Las cabeceras de la respuesta 404 marcaban MISS y DYNAMIC: venía del servidor, no de la caché.
wp post-type list los mostraba registrados y con has_archive activo.
Los rewrite slugs eran los mismos que antes del deploy.
Comparé las cabeceras de una respuesta cacheada (HIT, 200) y de una no cacheada (MISS, 404). El origen estaba roto; la caché lo tapaba.
wp rewrite list no contenía las reglas de esos archivos. El deploy había regenerado la opción rewrite_rules sin ellas.
wp rewrite flush en modo soft (el servidor es Nginx, no hay .htaccess que regenerar).
Comprobé 200 añadiendo una query string que salta la caché de página, antes de tocar la caché.
Solo con el origen verificado purgué la caché. Al revés, la copia buena del edge se habría sustituido por el 404 para todos.
Propuse el flush como último paso fijo del pipeline de deploy.
Fragmentos simplificados y sin datos del cliente, para que se vea el enfoque técnico real.
# Respuesta desde caché
curl -sI https://www.example.com/case-studies/ | grep -iE 'HTTP/|cache'
# HTTP/2 200 · x-cache: HIT
# Misma URL saltando la caché de página
curl -sI 'https://www.example.com/case-studies/?nocache=1' | grep -iE 'HTTP/|cache'
# HTTP/2 404 · x-cache: MISS · cf-cache-status: DYNAMICwp post-type list --fields=name,has_archive | grep -E 'case|integration|partner'
wp rewrite list | grep -E 'case-studies|integrations|partners' # vacío
wp rewrite flush
wp rewrite list | grep -c case-studies # reglas de vueltaEl código era correcto. El problema era un estado (reglas de reescritura) y se corrige regenerando ese estado.
Purgar primero habría servido el 404 a todo el tráfico, Googlebot incluido.
| Indicador | Antes | Después | Contexto |
|---|---|---|---|
| Archivos de CPT | 3 en 404 | 3 en 200 | casos, integraciones, partners |
| Respuesta en MISS | 404 | 200 | verificado saltando la caché |
| Deploy rehecho | — | No hizo falta | se corrigió el estado |
| Pipeline | Sin flush | Flush propuesto | tras cada deploy |
El orden importa: primero origen, luego verificar sin caché y solo al final purgar. Invertirlo convierte un fallo invisible en uno visible para todos.
Porque la caché seguía sirviendo una copia anterior. Las peticiones que no encuentran caché llegan al servidor y ahí aparece el error real.
No. Si el origen está roto, purgar hace que el error llegue a todo el mundo.
Con un parámetro de consulta único o revisando las cabeceras de caché de la respuesta.
Si ya tienes un WordPress en producción, reviso el contexto y te digo con honestidad si lo que necesitas es desarrollo, SEO técnico, rendimiento o automatización.
Empezar un proyecto