Los encabezados de caché HTTP determinan cómo los navegadores y los proxys almacenan temporalmente el contenido; si se configuran incorrectamente, ralentizan el tiempo de carga y aumentan notablemente la carga del servidor. En este artículo, mostraré cómo pequeños errores en los encabezados pueden afectar a su Estrategia de almacenamiento en caché sabotear y cómo puede ganar velocidad de forma cuantificable con unos pocos ajustes.
Puntos centrales
Las siguientes afirmaciones clave me ayudan a comprobar rápidamente los encabezados HTTP y a mantenerlos limpios de forma permanente.
- TTL Elegir correctamente: almacenar en caché los activos estáticos durante mucho tiempo, HTML durante poco tiempo y de forma controlada.
- Validación Utilizar: ETag y Last-Modified reducen las solicitudes innecesarias.
- Conflictos Evitar: los encabezados Origin y CDN deben coincidir.
- Control de versiones Usar: los hash de archivos permiten estrategias de caché agresivas.
- Monitoreo Establecer: medir la tasa de visitas y aumentarla sistemáticamente.
Lo que realmente controlan los encabezados de caché HTTP
Cache-Control, Expires, ETag y Last-Modified determinan si los contenidos son recientes, cuánto tiempo son válidos y cuándo los solicita el navegador. Con max-age defino la vida útil, con public/private la ubicación de almacenamiento en el navegador o en cachés compartidas. Directivas como no-store impiden completamente el almacenamiento, no-cache obliga a una revalidación antes de su uso. Para archivos estáticos, vale la pena una validez de un año, HTML obtiene tiempos cortos con revalidación inteligente. Además, me baso en inmutable, si se garantiza que los archivos permanecen inalterados mediante la versión hash.
Este control afecta directamente a la latencia, el ancho de banda y la carga del servidor. Un aumento de Tasa HIT Reduce los tiempos de espera y el trabajo administrativo. Además, optimizo la transferencia con Compresión HTTP, para que se tengan que transportar menos bytes. Si se hace una separación clara, se alivia la carga de las CDN, los proxys y las cachés de los navegadores por igual. Así es como consigo un funcionamiento fluido. Tiempos de carga a través de.
Planificación TTL en la práctica
El TTL adecuado se deriva de la frecuencia de cambio, el riesgo y la estrategia de recuperación. Para los activos con hash de archivo, establezco 12 meses, porque controlo los cambios a través de nuevos nombres de archivo. Para HTML, me baso en la dinámica del contenido: las páginas de inicio o las páginas de categorías suelen permanecer actualizadas entre 1 y 5 minutos, mientras que las páginas detalladas con comentarios lo están durante menos tiempo. Es importante un Ruta de reversión: Si se produce un error en tiempo real, necesito una purga rápida (Edge) y una revalidación forzada (must-revalidate) para los navegadores. Las respuestas de la API reciben TTL cortos, pero con estable-Directivas para que los usuarios vean las respuestas en caso de error. Documento estos perfiles por ruta o tipo de archivo y los integro en el proceso de compilación/implementación para que ningún cambio „silencioso“ anule involuntariamente la política de actualización.
Cómo las configuraciones erróneas sabotean la estrategia
Demasiado corto TTLs como max-age=60 segundos en CSS, JS o imágenes, obligan a realizar consultas constantes y destruyen las ventajas de la caché. Un global no-cache En las configuraciones CMS, incluso cuando gran parte de una página es estable, se produce una ralentización. Si faltan ETag o Last-Modified, el navegador vuelve a cargar los archivos por completo en lugar de comprobarlos de forma inteligente. Las cadenas de consulta superfluas generan fragmentación. Claves de caché y reducen significativamente la tasa de aciertos. Si Origin envía no-cache, la CDN ignora las cachés de borde, lo que da como resultado rutas más largas y una mayor carga del servidor.
El resultado lo veo en las métricas: más solicitudes, mayor tiempo de CPU y tiempos de respuesta cada vez mayores. Durante los picos de tráfico, aumenta el riesgo de que se produzcan tiempos de espera. Al mismo tiempo, crece el consumo de ancho de banda sin que los usuarios noten ninguna ventaja. Con solo echar un vistazo a DevTools, reconozco rápidamente estos patrones. Entonces, lo primero que hago es Control de la caché, antes de aumentar los recursos del servidor.
Recomendaciones por tipo de contenido: las directivas adecuadas
Dependiendo del tipo de contenido, utilizo diferentes Encabezado, para que las cachés funcionen correctamente y los usuarios vean datos actualizados. La siguiente tabla muestra perfiles probados que utilizo en proyectos.
| Contenido | Control de caché recomendado | Validez | Nota |
|---|---|---|---|
| JS/CSS/Imágenes (versiones) | público, max-age=31536000, inmutable | 12 meses | Utilizar nombre de archivo con hash (por ejemplo, app.abc123.js) |
| Archivos de fuentes (woff2) | público, max-age=31536000, inmutable | 12 meses | Tenga en cuenta CORS si se carga desde CDN. |
| HTML (público) | público, max-age=300, stale-while-revalidate=86400 | 5 minutos | Corto Frescura, recarga suave en segundo plano |
| HTML (personalizado) | privado, max-age=0, sin caché | revalidación | No se permite compartir en cachés compartidas. |
| APIs | público, max-age=60–300, stale-if-error=86400 | 1-5 minutos | Caso de error con estable amortiguar |
Estos perfiles cubren sitios típicos y ayudan a crear rápidamente Reglas Es importante establecer un sistema de versiones claro para los activos, de modo que los valores max-age largos no proporcionen archivos obsoletos. El HTML tiene una vida corta y se actualiza mediante la revalidación. Las API tienen tiempos cortos y una red de seguridad a través de stale-if-error. De este modo, las páginas permanecen accesibles incluso en caso de fallos. utilizable.
Almacenar correctamente los códigos de error y las redirecciones
Los redireccionamientos y las páginas de error merecen sus propias reglas. 301/308 (permanentes) pueden almacenarse en caché durante mucho tiempo en CDN y navegadores; aquí suelo establecer plazos de días a semanas para evitar cadenas de redireccionamiento. 302/307 (temporal) reciben TTL cortos, de lo contrario, los estados temporales se „congelan“. Para 404/410, vale la pena una frescura moderada (por ejemplo, de minutos a horas), para que los bots y los usuarios no realicen consultas constantemente; en el caso de contenidos que cambian con frecuencia, considero que 404 es más bien corto. 5xxPor norma general, no almaceno los errores en caché, sino que utilizo stale-if-error para entregar temporalmente copias que funcionan. De este modo, la plataforma se mantiene estable y reduzco la carga de re-renderización en rutas solicitadas con frecuencia pero que faltan.
Usar correctamente la validación: ETag y Last-Modified
Con ETag y Last-Modified, el navegador comprueba si realmente es necesario volver a cargar un recurso. El cliente envía If-None-Match o If-Modified-Since y, en el mejor de los casos, el servidor responde con 304 en lugar de 200. De este modo, ahorro transferencia y reduzco el Tráfico Claro. Para archivos estáticos, a menudo basta con Last-Modified, mientras que para contenidos generados dinámicamente utilizo ETags. Importante: generación coherente de ETag para que las cachés reconozcan los resultados.
Me gusta combinar la validación con estable-Directivas. stale-while-revalidate mantiene las páginas rápidas mientras se actualizan en segundo plano. stale-if-error garantiza la fiabilidad en caso de problemas con el backend. De este modo, la experiencia del usuario se mantiene estable y se protegen los servidores. Los siguientes fragmentos muestran los ajustes típicos que utilizo.
Header set Cache-Control "public, max-age=31536000, immutable"
/etc/nginx/conf.d/caching.conf location ~* .(css|js|png|jpg|svg|woff2)$ { add_header Cache-Control "public, max-age=31536000, immutable"; }
Directivas avanzadas y detalles
Además de max-age, utilizo específicamente s-maxage, para llenar las cachés de borde durante más tiempo que los navegadores. De este modo, la CDN puede durar, por ejemplo, 1 hora, mientras que los clientes vuelven a validar después de 5 minutos. debe revalidarse Obliga a los navegadores a comprobar las copias caducadas antes de utilizarlas, lo cual es importante en áreas relevantes para la seguridad. proxy-revalidar dirige la obligación a los cachés compartidos. Con sin transformación Evito que los proxys modifiquen imágenes o compresión sin preguntar. Para una amplia compatibilidad, además de Cache-Control, envío opcionalmente un Expira en-Fecha en el futuro (activos) o en el pasado (HTML), aunque las cachés modernas tienen en cuenta principalmente el control de caché. En las estrategias CDN, separo las reglas del navegador y las reglas periféricas: public + max-age para los clientes, más s-maxage/Surrogate-Control para el borde. Esta división maximiza las tasas de HIT sin riesgos de obsolescencia en los dispositivos finales.
Interacción con CDN y cachés periféricas
Una CDN respeta Encabezado de origen – Las directivas incorrectas en el origen anulan las cachés globales. Para las cachés compartidas, establezco public y, si es necesario, s-maxage, para que los bordes duren más que los navegadores. Surrogate-Control puede proporcionar reglas adicionales para las cachés de borde. Si no-cache llega al origen, la CDN rechaza la solicitud deseada. Almacenamiento. Por eso coordino deliberadamente la estrategia del navegador y la CDN.
En los nuevos proyectos, también examino las estrategias de carga previa. Con HTTP/3 Push y precarga Cargo los activos críticos con antelación y reduzco los bloqueos de renderizado. Esta técnica no sustituye al almacenamiento en caché, sino que lo complementa. Junto con los TTL largos para los activos, el rendimiento inicial mejora notablemente. Así es como trabajo en el rango de la red antes de que el Servidor ni siquiera suda.
La estrategia Vary en detalle
Variar decide qué encabezados de solicitud generan nuevas variantes. Yo mantengo Vary al mínimo: para HTML, normalmente Accept-Encoding (compresión) y, si es necesario, idioma; para activos, idealmente ninguno. Un Vary demasiado amplio (por ejemplo, User-Agent) destruye la tasa de visitas. Al mismo tiempo, es necesario ETags el específico de la representación Reflejar la variante: si entrego gzip o br, se aplican los ETags por variante de codificación y establezco Vary: Accept-Encoding. Si utilizo ETags débiles (W/), me aseguro de generarlos de forma coherente, de lo contrario se producen 200 innecesarios. Por lo general, las fuentes o las imágenes deben funcionar sin Vary; así las claves permanecen estables. Mi principio: primero definir qué variantes son necesarias desde el punto de vista técnico y solo entonces ampliar Vary, nunca al revés.
Monitorización y diagnóstico en DevTools
Siempre empiezo en el Pestaña Red las herramientas del navegador. Allí puedo ver si las respuestas provienen de la caché, cuánto tiempo tienen y qué directivas se aplican. Las columnas «Age», «Cache-Control» y «Status» ayudan a realizar comprobaciones rápidas. Una tasa de aciertos inferior a 50% indica que es necesario actuar, mientras que los valores objetivo de 80% y superiores son realistas. En caso de valores atípicos, primero compruebo los encabezados correspondientes.
Herramientas como PageSpeed o GTmetrix confirmaron mis pruebas locales. Medidas. A continuación, comparo antes y después de los cambios para cuantificar los beneficios. Si se añaden grandes cantidades de transferencia, activo sistemáticamente la compresión moderna. De este modo, ahorro más milisegundos. Así, justifico cada ajuste con datos concretos. cifras.
Comprobaciones automatizadas y CI
Para evitar que las reglas se deterioren, incorporo comprobaciones de encabezados en la CI. Defino perfiles objetivo por ruta y realizo comprobaciones aleatorias en cada compilación contra el entorno de pruebas. A menudo basta con comprobaciones simples de shell:
# Ejemplo: directivas esperadas para activos versionados curl -sI https://example.org/static/app.abc123.js | grep -i "cache-control" # Vigencia y revalidación esperadas para HTML
curl -sI https://example.org/ | egrep -i "cache-control|etag|last-modified" # Inspeccionar el encabezado Age y el estado de la caché (si está disponible) curl -sI https://example.org/styles.css | egrep -i "age|cache-status|x-cache"
En combinación con pruebas sintéticas, planifico „auditorías de encabezados“ periódicas. Los resultados se incorporan al código de la infraestructura. De este modo, se mantiene Políticas Estable, independientemente de quién haya realizado los últimos cambios en el CMS, la CDN o la configuración del servidor.
Optimización del alojamiento: almacenamiento en caché de páginas, objetos y códigos de operación
Además de las cachés del navegador y CDN, apuesto por Cachés del servidor. El almacenamiento en caché de páginas proporciona páginas HTML completas, el almacenamiento en caché de objetos almacena los resultados de la base de datos y OPcache se ocupa del código byte PHP. Estas capas alivian considerablemente la carga del backend cuando los encabezados están configurados correctamente. Solo la combinación de bordes rápidos, TTL saludables y cachés de servidor proporciona valores máximos reales. De esta manera, mantengo estables los tiempos de respuesta, incluso cuando Tráfico aumenta.
La siguiente visión general del mercado muestra lo que tengo en cuenta a la hora de elegir un servicio de alojamiento. Una tasa de visitas elevada, la disponibilidad de Redis y un buen precio son los factores que determinan mi elección.
| Proveedor de alojamiento | Puntuación PageSpeed | Compatibilidad con Redis | Precio (inicial) |
|---|---|---|---|
| webhoster.de | 98/100 | Sí | 4,99 € |
| Otro1 | 92/100 | Opcional | 6,99 € |
| Otro2 | 89/100 | No | 5,99 € |
Estrategias de invalidación y purga
La creación de caché es solo la mitad del trabajo: la Invalidación decide sobre la seguridad y la agilidad. En el caso de los activos, realizo cambios mediante hash de archivos, por lo que no es necesario realizar purgas. Para HTML y API, planifico purgas específicas: después de la implementación (rutas críticas), después de la publicación (solo páginas afectadas) o después de los indicadores de características. Me gusta admitir cachés de borde mediante etiquetas/claves para Grupos en lugar de eliminar rutas individualmente. Siempre que es posible, utilizo „Soft Purge“: los contenidos se marcan inmediatamente como „obsoletos“ y solo se vuelven a validar en la siguiente solicitud. De este modo, evito picos de carga debido a recuperaciones simultáneas. Es importante realizar un mapeo organizado: ¿qué eventos desencadenan qué purga? Esta lógica debe versionarse en la plataforma.
Seguridad y protección de datos: público frente a privado
Las páginas personalizadas pertenecen al Caché privado del navegador, no en cachés compartidas. Por eso establezco private, max-age=0 o no-cache para este tipo de contenidos. Las páginas HTML públicas pueden obtener public con una frescura breve. Si presto atención a las cookies en la solicitud, el contenido permanece claramente separado. De este modo evito que usuarios ajenos accedan involuntariamente Datos otros ven.
Al mismo tiempo, aplico reglas estrictas para las áreas de pago o cuentas. no-store impide cualquier almacenamiento de respuestas sensibles. Para el resto del sitio, sigo siendo generoso para garantizar un buen rendimiento. Esta clara separación mantiene la plataforma rápida y segura. Documento la Perfiles, para que todos los participantes mantengan la coherencia.
Comprender el almacenamiento en caché heurístico
Si faltan Cache-Control y Expires, las cachés acceden a heurística atrás, aproximadamente un porcentaje del tiempo transcurrido desde la última modificación. Esto da lugar a resultados difíciles de reproducir y a una frescura variable. Evito estos automatismos marcando explícitamente cada ruta relevante con Cache-Control. Cuando Last-Modified es impreciso (por ejemplo, en plantillas dinámicas), prefiero utilizar ETags. De este modo, controlo activamente la frescura y obtengo métricas estables en todos los clientes.
Solicitudes de rango y archivos grandes
Para medios y descargas, reproducir alcanceLas solicitudes (206 Partial Content) desempeñan un papel importante. Activo Accept-Ranges y proporciono ETags/Last-Modified consistentes para que los navegadores puedan reutilizar partes de forma limpia. En el caso de los segmentos de vídeo versionados (HLS/DASH), establezco TTL largos; los manifiestos en sí mismos siguen siendo efímeros. Importante: manejar correctamente If-Range para que las subáreas no den lugar a estados mixtos obsoletos cuando se producen cambios. Para contenidos sensibles sigue aplicándose lo siguiente: no almacenar con no-store, incluso si Range está en juego.
Solucionar rápidamente los errores frecuentes: mi libro de jugadas
Empiezo con un inventario de encabezados: ¿Cuáles? directivas ¿Qué proporciona Origin y qué cambia la CDN? A continuación, defino perfiles TTL por tipo de contenido. Los activos versionados tienen un año, el HTML cinco minutos más revalidación. Activo ETag/Last-Modified siempre que tiene sentido. A continuación, compruebo si hay parámetros Vary o Query innecesarios que Tasa HIT Pulse.
En el siguiente paso, me ocuparé de los detalles de red fuera de la caché. Un incorrecto Encabezado de juego de caracteres o la falta de compresión también cuesta tiempo. Después vuelvo a medir: DevTools, pruebas sintéticas y, si es necesario, monitorización de usuarios reales. Si los valores son correctos, congelo las reglas en la configuración y las mantengo versionadas. Así crece la calidad Paso a paso.
Brevemente resumido
Con correcto Encabezados HTTP Controlo qué se almacena, dónde y durante cuánto tiempo, lo que me permite ahorrar tiempo y recursos. Los TTL largos para los activos versionados, los tiempos cortos más la revalidación para HTML y las directivas stale significativas aportan velocidad y resiliencia. Las claves de caché limpias, el versionado coherente y las reglas claras para público/privado evitan los obstáculos típicos. La supervisión proporciona pruebas y muestra las lagunas restantes. Quien proceda así, eleva el Actuación notable y estable.


