Gestión del Caché de Archivos Estáticos en PowerWAF
Introducción
Una correcta gestión del caché es clave para aprovechar al máximo los beneficios que ofrece un CDN como PowerWAF.
Al almacenar contenido estático en ubicaciones geográficamente distribuidas, se reduce la carga en el servidor de origen y se mejora significativamente la velocidad de carga del sitio web para los usuarios.
PowerWAF, por defecto, analiza el comportamiento del tráfico y aplica reglas inteligentes para optimizar el rendimiento sin necesidad de configuración avanzada. Sin embargo, mantener una estrategia de caché coherente entre el servidor de origen y PowerWAF es esencial para garantizar una experiencia rápida, segura y actualizada.
Configuración del caché de archivos estáticos
PowerWAF respeta las cabeceras HTTP de caché establecidas por el servidor web. Además, cuando no se define una política explícita de caché, PowerWAF aplica un comportamiento por defecto que favorece el rendimiento para archivos estáticos seguros.
Esta guía explica cómo controlar correctamente el almacenamiento en caché de archivos estáticos en tu aplicación.
Cómo PowerWAF interpreta las cabeceras de caché
Cuando una respuesta incluye cabeceras HTTP como Cache-Control
, Expires
o Last-Modified
, PowerWAF las analiza para determinar si el archivo debe almacenarse en caché o no. La lógica sigue los estándares comunes de comportamiento de los navegadores, garantizando compatibilidad y previsibilidad.
Cabeceras principales que considera PowerWAF:
Cabecera | Propósito |
---|---|
Cache-Control | Directiva principal que define las reglas de caché (public , no-store , etc.). |
Expires | Define una fecha/hora de expiración específica para el contenido. |
Last-Modified | Indica cuándo fue modificado el recurso por última vez. |
Si está presente
Cache-Control: max-age
, tiene prioridad sobreExpires
. Si no se definen cabeceras de caché, PowerWAF puede usarLast-Modified
como alternativa.
Ejemplos de comportamiento:
Cache-Control: public
→ ✅ Cacheado.Cache-Control: no-store
→ ❌ No se cachea nunca.Cache-Control: no-cache
→ ⚠️ Se cachea, pero debe validarse con el origen.Cache-Control: private
→ ❌ No se cachea en cachés compartidas como el CDN de PowerWAF.Cache-Control: max-age=3600
→ ✅ Cacheado durante 1 hora.Cache-Control: must-revalidate
→ ⚠️ Cacheado, pero requiere validación después de expirar.
Si no se define ninguna de estas cabeceras, PowerWAF aplicará reglas de caché por defecto según el tipo de archivo (ver siguiente sección).
Comportamiento por defecto en PowerWAF
Cuando no hay cabeceras de caché presentes, PowerWAF aplica una estrategia inteligente por defecto:
- Archivos con extensiones específicas se consideran seguros y se cachean automáticamente.
- Archivos estáticos con parámetros ?v= en la URL (ej.
style.css?v=2
) se tratan como inmutables y se cachean. - Para archivos con
Last-Modified
pero sin política explícita, PowerWAF usa una heurística basada en la fecha de modificación.
Extensiones cacheadas por defecto:
avif, bmp, css, doc, docx, ejs, eot,
eps, gif, ico, jar, jpeg, jpg, js, mid,
midi, otf, pdf, pict, pls, png, ppt, pptx,
ps, svg, svgz, swf, tif, tiff, ttf, webp,
woff, woff2, xls, xlsx
Configuraciones comunes de caché
Directiva Cache-Control | ¿Se cachea? | Explicación |
---|---|---|
public | ✅ Sí | Puede almacenarse en cachés del navegador y compartidas (como CDNs). |
private | ⚠️ Limitado | Solo se almacena en el navegador del usuario. |
no-cache | ⚠️ Con validación | Puede almacenarse, pero debe validarse con el servidor. |
no-store | ❌ No | No se almacena en caché bajo ninguna circunstancia. |
max-age=SEGUNDOS | ✅ Sí | Tiempo que puede almacenarse sin nueva validación. |
must-revalidate | ⚠️ Sí | Requiere validación obligatoria una vez expirado. |
immutable | ✅ Sí | Se considera que el archivo nunca cambiará. |
Permitir el caché
¿Por qué permitir el caché?
Permitir el almacenamiento en caché de archivos estáticos mejora el rendimiento del sitio y reduce la carga en el servidor. Cuando el caché está habilitado, tanto el navegador como el CDN de PowerWAF pueden servir archivos desde la caché, evitando solicitudes repetidas al servidor de origen.
Esto es especialmente útil para archivos que cambian poco (ej. imágenes, CSS o archivos JS versionados como app.v3.js
). También mejora los puntajes en herramientas como Google PageSpeed.
✅ Recomendado para: Imágenes, fuentes, hojas de estilo y scripts JavaScript que cambian raramente.
Apache (.htaccess)
<FilesMatch "\\.(jpg|jpeg|png|css|js|woff2?)$">
Header set Cache-Control "public, max-age=31536000, immutable"
</FilesMatch>
Nginx
location ~* \\.(jpg|jpeg|png|css|js|woff2?)$ {
add_header Cache-Control "public, max-age=31536000, immutable";
}
IIS (web.config)
<configuration>
<system.webServer>
<staticContent>
<clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="365.00:00:00" />
</staticContent>
<staticContent>
<mimeMap fileExtension=".css" mimeType="text/css" />
<mimeMap fileExtension=".png" mimeType="image/png" />
<mimeMap fileExtension=".jpg" mimeType="image/jpeg" />
</staticContent>
</system.webServer>
</configuration>
Evitar el caché
¿Por qué evitar el caché?
En algunos casos, es importante asegurarse de que el navegador y el CDN de PowerWAF siempre obtengan la versión más reciente de un archivo. Esto es esencial cuando:
- Los archivos cambian frecuentemente pero conservan el mismo nombre.
- Los archivos contienen información sensible o personalizada.
- Se necesita control completo sobre cada solicitud.
❌ Recomendado para: Archivos dinámicos, datos sensibles o archivos que cambian sin cambiar el nombre.
Apache (.htaccess)
<FilesMatch "\\.(jpg|jpeg|png|css|js)$">
Header set Cache-Control "no-store, no-cache, must-revalidate"
Header set Pragma "no-cache"
Header set Expires "0"
</FilesMatch>
Nginx
location ~* \\.(jpg|jpeg|png|css|js)$ {
add_header Cache-Control "no-store, no-cache, must-revalidate";
add_header Pragma "no-cache";
add_header Expires "0";
}
IIS (web.config)
Crea un archivo web.config
en la carpeta donde están los archivos y añade lo siguiente:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<staticContent>
<clientCache cacheControlMode="DisableCache" />
<!-- Reescribe el tipo MIME para desactivar el caché -->
<remove fileExtension=".pdf" />
<mimeMap fileExtension=".pdf" mimeType="application/pdf" />
<remove fileExtension=".jpg" />
<mimeMap fileExtension=".jpg" mimeType="image/jpeg" />
</staticContent>
</system.webServer>
</configuration>
Ejemplos prácticos
Archivo | Objetivo | Configuración recomendada |
---|---|---|
logo.jpg | Cachear 1 año | public, max-age=31536000, immutable |
style.css?v=2 | Archivo versionado | Cacheable automáticamente por PowerWAF |
main.css | Evitar caché | no-store, no-cache, must-revalidate |
private-doc.pdf | Documento sensible | no-store |
custom.js sin cabecera | Depende del tipo | Cacheado por defecto si es .js |
Después de realizar cualquier cambio en la política de caché en el servidor de origen, es necesario limpiar la caché de PowerWAF para que los cambios se reflejen correctamente.
Buenas prácticas
- Si un archivo nunca cambia, actívalo con
max-age
eimmutable
. - Si cambia pero mantiene el nombre, desactiva el caché.
- Si puedes, versiona el archivo (ej.
?v=3
) para habilitar caché con control. - PowerWAF cacheará muchos archivos por defecto. Si necesitas otro comportamiento, define las cabeceras explícitamente.