...

Estrategias de control de la caché HTTP en el alojamiento: dominar la optimización web

Utilizo el alojamiento de control de caché para controlar específicamente cómo los navegadores, proxies y CDNs almacenan en caché el contenido para que las páginas se carguen más rápido y sigan estando actualizadas. Para ello, utilizo directivas como max-age, no-cache o no-store y así equilibrar el rendimiento, la frescura y la carga del servidor para HTML, activos y API.

Puntos centrales

El siguiente resumen muestra las palancas más importantes para Optimización web con control de caché.

  • Diseño TTLMax-age largo para activos, tiempos cortos o revalidación para HTML.
  • ValidaciónETag y Last-Modified reducen el tráfico de datos con respuestas 304.
  • Controles de bordess-maxage, stale-while-revalidate y stale-if-error para CDNs.
  • Versionado: Los nombres de archivo con hash/versión permiten cachés agresivas.
  • MonitoreoCompruebe continuamente los índices de aciertos de la caché, las cuotas 304 y el TTFB.

¿Qué hace que el control de la caché sea tan eficaz en el alojamiento?

Muevo el trabajo del servidor Origen al Cache, reducir la latencia y ahorrar ancho de banda. Una cabecera de control de caché correctamente configurada controla cuánto tiempo permanecen válidos los archivos y cuándo los solicita el cliente al servidor. Preveo largos periodos de validez para activos como imágenes, CSS y JS, mientras que el HTML vive poco tiempo o se valida siempre. Esto significa que los usuarios encuentran respuestas en caché con más frecuencia y siguen recibiendo actual Contenido. Desde el principio evito los típicos escollos, como las cabeceras contradictorias o la falta de versiones, por ejemplo con esto Guía Cache-Fix.

Conceptos básicos: Combinar directivas correctamente

Con max-age Establezco el tiempo de vida en segundos, como 31536000 durante un año para los recursos estáticos. no-cache obliga al cliente a validar antes de su uso, pero no prohíbe el almacenamiento. no-store excluye cualquier almacenamiento y protege las respuestas sensibles, como los datos de pago. public permite el almacenamiento en caché en el almacenamiento compartido como CDNs, private se limita a la caché del navegador. immutable señala que el archivo permanece sin cambios, que se puede cambiar con Versionado (por ejemplo, app.v1.2.js) son un excelente complemento.

Definir claramente las cabeceras Vary y las claves de caché

Me aseguro de que los objetos almacenados en caché coincidan con el tipo de solicitud. La dirección Variar-por lo tanto, debe formar parte de cualquier estrategia seria de caché. Influye en la clave de caché y evita la reutilización incorrecta:

  • Aceptación de codificaciónObligatorio para gzip/br, para que las variantes comprimidas y no comprimidas se almacenen en caché por separado.
  • Aceptar idioma: Utilizar sólo si realmente estoy entregando contenido dependiente del idioma - de lo contrario existe el riesgo de fragmentación.
  • Galleta: Evito un global Vary: Cookie, porque destruye las tasas de acierto de la caché. En su lugar, segmento específicamente según las cookies relevantes (por ejemplo, variante A/B) o elimino las cookies irrelevantes en el borde.
  • AutorizaciónEl contenido que depende de cabeceras auth no se almacena en cachés compartidas o las claves deliberadamente si el proveedor CDN lo soporta.
# Apache: cabeceras significativas Vary para HTML y activos

  Cabecera merge Vary "Accept-Encoding"


  Cabecera merge Vary "Accept-Encoding"

También defino reglas de clear cache key en las CDN: No incluyo en la clave parámetros de consulta que sólo se utilizan para el seguimiento (por ejemplo, utm_*). Esto evita la explosión de claves sin poner en peligro la frescura.

Práctica: Configuración en Apache y Nginx

En Apache establezco reglas en el .htacceso o en el VirtualHost. Separo el HTML de los activos, doy a los archivos estáticos una larga vida útil y aseguro el HTML con revalidación. Evito conflictos con las cabeceras Expires, los navegadores modernos respetan principalmente el control de caché. En Nginx, hago cumplir las posiciones correctas de add_header y me aseguro de que ninguna instrucción downstream las sobrescriba. Así controlo Caché del navegador coherente en toda la pila.

Conjunto de encabezados Cache-Control "public, max-age=31536000, immutable"


  Header set Cache-Control "no-cache, must-revalidate"
location ~* \.(css|js|png|jpg|svg|woff2)$ {
  add_header Cache-Control "public, max-age=31536000, immutable";
}
location ~* \.(html)$ {
  add_header Cache-Control "no-cache, must-revalidate";
}

Caché sólo CDN para HTML

Si el navegador debe comprobar siempre, pero el Edge se le permite almacenar en caché, me puse diferentes tiempos de vida para el cliente y CDN:

# Apache: Navegador revalidado, Edge cacheado 5 minutos

  Conjunto de encabezados Cache-Control "public, max-age=0, s-maxage=300, must-revalidate, stale-while-revalidate=30, stale-if-error=86400"
  Merge de cabecera Vary "Accept-Encoding"


# Nginx
location ~* \.(html)$ {
  add_header Cache-Control "public, max-age=0, s-maxage=300, must-revalidate, stale-while-revalidate=30, stale-if-error=86400";
  add_header Vary "Accept-Encoding";
}

Validación: uso efectivo de ETag y Last-Modified

Combino Control de la caché con ETag y Last-Modified para revalidar de forma controlada. Tras la expiración, el navegador envía If-None-Match o If-Modified-Since; el servidor responde con 304 si el recurso no ha cambiado. Esto ahorra bytes y reduce significativamente el tiempo de CPU en Origin. Importante: las ETags deben ser coherentes, de lo contrario se producirán pérdidas innecesarias a pesar de que el contenido no haya cambiado. En los clústeres, desactivo las ETags débiles o creo hashes fuertes para que la etiqueta revalidación sigue siendo fiable.

Coherencia en entornos multiservidor

Me aseguro de que las ETags no se basen en características basadas en inodos que difieran entre nodos. Proporciono un hash estable (artefacto de construcción) o confío en la última modificación cuando los despliegues son atómicos. Para respuestas dinámicas, utilizo ETags de aplicación que coinciden exactamente con el hash de la carga útil. Si la revalidación es más cara que la reimpresión, respondo deliberadamente con 200 y un TTL corto: la medida decide.

Estrategias por tipo de recurso

Diferencio según el tipo de contenido, porque el HTML, los activos, las API y las respuestas sensibles tienen diferentes Requisitos. Los TTL largos para archivos versionados ofrecen los mejores valores, mientras que el HTML debe seguir gestionándose de forma estricta. Planifico tiempos de vida cortos para las API e incorporo tolerancia a fallos. Evito el almacenamiento de respuestas personales o confidenciales. Quienes profundizan en las interfaces se benefician de patrones compactos para Almacenamiento en caché de la API en el alojamiento, que adapto a las características de la respuesta.

Tipo de recurso Directiva recomendada Razón
Activos estáticos (imágenes, CSS, JS) público, max-age=31536000, inmutable Almacenamiento prolongado; se impide el versionado Stale-Contenido
Páginas HTML no-cache, must-revalidate Contenido fresco a través de revalidación
APIs public, max-age=300, stale-if-error=86400 Plazo corto, utilizable para Errores
Datos sensibles no-store Sin almacenamiento de Protección de datos-Razones

Códigos de estado, redireccionamientos y páginas de error

  • 301 puede y debe almacenarse en caché (TTL largo), ya que es permanente. Versiono las URL de destino para facilitar cambios posteriores.
  • 302/307 son temporales - TTL corto o revalidación, de lo contrario existe el riesgo de rutas incorrectas en la caché.
  • 404 Almaceno en caché durante poco tiempo (por ejemplo, 60-300s) para que los hotlinks defectuosos no sean una carga para Origen sin bloquear las recreaciones reales.
  • 500+ No guardo en caché, pero dejo el Edge stale-if-error para ofrecer a los usuarios la información más reciente.

Directivas ampliadas para CDN y Edge

Con s-maxage Separo el tiempo de vida en la caché de borde del tiempo de vida en el navegador. stale-while-revalidate sigue entregando contenido caducado mientras el borde se actualiza en segundo plano. stale-if-error mantiene las páginas accesibles durante las interrupciones del backend y aumenta la conversión y la confianza. must-revalidate fuerza una comprobación tras la caducidad y evita renovaciones no deseadas. Este control repercute directamente en los índices de aciertos de la caché y Escala especialmente durante los picos de tráfico.

Cabeceras sustituta y de borde

En configuraciones con renderizado de bordes, también utilizo cabeceras sustitutas (p. ej. Control sustituto) para establecer más TTL específicos de CDN y políticas de caducidad sin cambiar el comportamiento del navegador. De este modo, separo estrictamente el usuario final y la estrategia de borde y mantengo mi control sobre ambos niveles.

Invalidaciones y liberaciones

Planifico la invalidación conscientemente: los activos versionados rara vez necesitan purgas, mientras que las rutas HTML y API las necesitan más a menudo. Defino rutinas claras para:

  • Purga por URL/Patrón para hotfixes y errores.
  • Purgas basadas en etiquetas (si se admite) para invalidar el contenido relacionado con la temática.
  • Lanzamientos escalonadosEn primer lugar, despliegue los activos y, a continuación, el HTML con las nuevas referencias; de este modo se evitan las referencias rotas.

WordPress: Implementar el almacenamiento en caché de forma segura

En WordPress, activo las cabeceras mediante plugins o mi propio código y observo el Plantilla-estructura. Los archivos estáticos en wp-includes y uploads obtienen TTLs largos más inmutable, las páginas obtienen no-cache con must-revalidate. Precaución con los usuarios registrados: las cookies privadas y diferenciadas evitan la personalización incorrecta en la caché. Elimino tropiezos típicos con reglas claras y un vistazo a estos Error de caché de WordPress. Si es necesario, añado caché de páginas del lado del servidor y OPCache para que la ejecución de PHP sea perceptible. disminuye.

<?php
function add_cache_headers() {
    if (!is_admin()) {
        header('Cache-Control: public, max-age=31536000, immutable', true);
    }
}
add_action('send_headers', 'add_cache_headers');

Desactivar la personalización y las cookies

Me aseguro de que Set-Cookie no se establece de forma generalizada en todas las páginas. Las cookies innecesarias impiden el almacenamiento en caché compartido. Entrego explícitamente para los usuarios registrados:

# Ejemplo de cabecera para sesiones iniciadas
Cache-Control: private, no-store, max-age=0
Vary: Accept-Encoding

En cambio, las páginas de listas y detalles sin personalización tienen toda la potencia de la CDN. Cuando la personalización es necesaria, trabajo con fragmentos de borde o pequeñas cargas útiles de API y almaceno el resto en caché de forma agresiva.

Errores comunes y cómo los soluciono

Demasiado bajo TTL genera un trabajo innecesario del servidor y mayores tiempos de respuesta. Las cabeceras ausentes o contradictorias obligan a los navegadores a un comportamiento heurístico y cuestan rendimiento. Sin versionado, corro el riesgo de que los activos queden obsoletos a pesar de las largas cachés. Diferentes estrategias ETag en varios servidores provocan fallos; me aseguro de que los hashes sean coherentes o desactivo las ETags allí. También compruebo si los intermediarios, como las pasarelas, tienen sus propios Encabezado y sobrescribir.

Evitar la caché heurística

Si no se establece ni Cache-Control ni Expires, los navegadores adivinan. Por ello, siempre desactivo las directivas explícitas y limpio los problemas heredados (p. ej. Pragma: no-cache de proxies antiguos) para obtener un comportamiento determinista.

Cadenas de consulta y robo de caché

Yo utilizo la eliminación de cachés mediante hashes de nombres de archivo (style.abc123.css) en lugar de cadenas de consulta. Muchas cachés tratan diferentes consultas como objetos separados y, por tanto, aumentan el número de objetos; en cambio, con archivos sin cambios, un nuevo hash conduce a una invalidación limpia.

Supervisión, pruebas y métricas

Mido los efectos y hago correcciones específicas en lugar de cambios radicales, porque los datos son mejores que el instinto. borrar. Utilizo curl para comprobar las cabeceras, DevTools para simular primeras y repetidas visualizaciones y Lighthouse para evaluar el efecto en los ratios. En cuanto al servidor y la CDN, controlo los índices de aciertos de la caché, las cuotas 304, los bytes guardados y el TTFB. Los registros me muestran si el HTML se revalida realmente y si los activos vuelven a solicitarse en contadas ocasiones. Esto me permite detectar a tiempo las lagunas y mejorar. objetivo.

Señales de diagnóstico adicionales

  • Edad-header muestra cuánto tiempo ha estado un objeto en la caché - ideal para comprobar s-maxage.
  • Estado de la caché (si está disponible) revela HIT/MISS/STALE y la fuente (BROWSER, CDN, ORIGEN).
  • Horario del servidor Lo utilizo para mis propios marcadores (por ejemplo, cache;desc=“revalidated“) para hacer visibles las rutas en las herramientas.

Automatizo las comprobaciones en la canalización CI/CD: Después de cada despliegue, un pequeño catálogo de pruebas valida las cabeceras, los códigos de estado y los tamaños de respuesta de las rutas principales. Las regresiones se detectan inmediatamente.

SEO y efectos comerciales

Una entrega más rápida refuerza Core Web Vitals, reduce los rebotes y eleva el Visibilidad. Cada ida y vuelta evitada reduce los costes del servidor y minimiza el riesgo de picos de carga. Con sitios de tráfico intensivo, ahorro una cantidad notable de volumen de datos cada mes; dependiendo de la tarifa, esto puede sumar cantidades de tres dígitos en euros. Un alto índice de aciertos en caché también estabiliza los tiempos de respuesta en campañas y ventas. Los que aumentan el rendimiento de forma previsible suelen aumentar también el Conversión.

Lista de control práctica en 7 pasos

(1) Inventariar archivos y separar HTML, activos, APIs y respuestas sensibles; estas Segmentación facilita las reglas. (2) Introducir versionado para CSS/JS/imágenes; usar hashes en los nombres de archivo y establecer inmutable. (3) Establecer no-cache y must-revalidate para HTML; mantener las páginas frescas y controlables. (4) Define TTLs cortos para APIs y stale-if-error para mitigar fallos. permanezca en. (5) Active ETag o Last-Modified de forma coherente; compruebe las cuotas 304. (6) Sincronice las cabeceras CDN y Origin; utilice s-maxage para Edge. (7) Mida los índices de aciertos, TTFB y bytes ahorrados; optimice iterativamente y documente las decisiones.

Casos prácticos y muestras adicionales

  • API con solicitudes condicionalesPermito explícitamente respuestas GET/HEAD en la caché compartida (pública) con un TTL y ETag cortos. Solo almaceno en caché las respuestas POST si están definidas con precisión y no se modifican; por defecto no se pueden almacenar en caché.
  • Archivos de gran tamaño y solicitudes de alcancePara los medios de comunicación Accept-Ranges: bytes y TTLs largos; el Edge releva al Origen al reanudar las descargas.
  • Imágenes con capacidad de respuestaSi emito diferentes variantes de imagen en función del dispositivo, tecleo específicamente (por ejemplo, según DPR o Width) y evito Vary incontrolado en demasiadas señales.
  • Sin transformaciónSi la calidad de la imagen o la criptografía son críticas, utilizo Cache-Control: no-transform, para que los proxies no modifiquen el recurso.

Resumen para llevar

Utilizo Cache-Control específicamente para Actuación, para armonizar plazos y costes. Los TTL largos y el versionado de activos, la revalidación de HTML y los plazos cortos de las API ofrecen resultados fiables. ETag y Last-Modified reducen el tráfico de datos, mientras que las políticas de s-maxage y stale aprovechan la caché. La monitorización hace visibles los efectos y muestra dónde debo mejorar. Así, el alojamiento sigue siendo rápido, controlable y económico. atractivo.

Artículos de actualidad