Cómo configurar las cabeceras Cache-Control en Apache

  • Anthony Heddings
  • 29 de julio de 2020, 11:00am EDT

apache

El navegador de cada usuario hace uso de una caché incorporada para almacenar los objetos descargados, lo que puede acelerar significativamente la repetición de las visitas a su sitio web al cargar desde el disco en lugar de la red. Aquí se explica cómo configurarlo en Apache.

¿Cómo funciona el caché?

La primera vez que un usuario se conecta a su sitio, descargará todos los recursos estáticos necesarios para renderizar la página, incluyendo cosas como su logotipo. Cuando naveguen a una nueva página, ésta cargará su logotipo desde la memoria en lugar de pedirlo de nuevo, acelerando el rendimiento de forma significativa y reduciendo la carga de su servidor web en el proceso.

Este es un caché del lado del cliente, pero muchos sitios también harán uso de una Red de Entrega de Contenido, o CDN. Una CDN es una red de servidores que se sitúa delante de su servidor web principal, o servidor «de origen». Esta red almacena en caché sus páginas, aumentando el ancho de banda máximo, reduciendo la latencia de acceso y reduciendo en gran medida el estrés de su servidor de origen. Si quieres saber más sobre las CDNs, puedes leer nuestra guía sobre ellas aquí.

Cache-ControlEs una cabecera que puedes configurar en tu servidor web para que se añada a todas las peticiones salientes, y que indicará al navegador y a las CDNs cómo almacenar en caché tu contenido.

Publicidad

Ciertas páginas nunca deben ser almacenadas en caché por cachés compartidas como las CDNs. Al hacerlo se corre el riesgo de mostrar la información personal de un usuario a otros. Como regla general, si la página va a ser exactamente la misma para todos los usuarios, como tu página de inicio, puedes almacenarla en caché. Si muestra información confidencial del usuario, querrás ponerla en la lista negra de tu caché. Los recursos estáticos, como el CSS y las imágenes, normalmente se pueden almacenar en caché para todos, a menudo durante mucho más tiempo.

La cantidad de tiempo que el objeto pasa en la caché también es importante. Conocido como Time-To-Live (TTL), la edad máxima de sus recursos en caché determina el tiempo que el objeto permanecerá en la caché antes de ser invalidado, e incitar al usuario a solicitar un nuevo objeto. Para los recursos estáticos que no cambian mucho, puedes establecer valores de TTL muy altos, normalmente alrededor de dos años. Para las cosas que se quieren actualizar, se deben establecer valores TTL más bajos para evitar que los recursos obsoletos permanezcan en la caché durante demasiado tiempo.

Siempre se pueden utilizar nombres de archivo versionados para activar una recarga de la caché. Si publica una nueva versión de una hoja de estilo CSS, puede nombrarla styles-1.0.1.css, y el navegador del usuario (y cualquier CDN que tenga delante) la verá como un nuevo archivo que debe volver a descargarse. Además, para algunas CDNs, puede emitir invalidaciones manuales para vaciar la caché existente sin cambiar ningún nombre de archivo.

Cómo usar Cache-Control en Apache

Cache-Control tiene algunas opciones:

  • public – Puede ser cacheado por cualquiera, incluyendo navegadores y CDNs. Utilice esta opción para la mayoría de los objetos estáticos.
  • private – Contiene datos sensibles que no pueden ser almacenados en caché por CDNs o proxies inversos. El navegador del usuario puede almacenarlo en caché localmente. Utilícelo para la mayoría de las páginas autenticadas.
  • no-cache – A pesar del nombre, no desactiva el almacenamiento en caché. El navegador puede seguir almacenando en caché la respuesta para mejorar el rendimiento, pero debe comprobar si hay actualizaciones en el servidor de origen antes de utilizarla. Use esto si quiere que el usuario revalide cada vez.
  • no-store – Desactiva la caché por completo. Utilice esto sólo para los datos altamente sensibles que no deben ser enviados dos veces.

Además, puede añadir la directiva no-transform, que desactiva cualquier conversión que se pueda hacer al recurso. Por ejemplo, algunas CDNs comprimen las imágenes para reducir el ancho de banda. Esta directiva desactiva ese comportamiento.

En Apache, tendrá que configurar esta cabecera manualmente utilizando la directiva Header set, así:

Header set Cache-Control "max-age=84600, public"

El valor max-age se establece en segundos, por ejemplo, max-age=300 para un TTL de cinco minutos, y max-age=63072000 para dos años.

Publicidad

Puede poner esta directiva en la raíz de su configuración para aplicarla en todo el sitio, pero un método mejor es aplicar la configuración dependiendo del tipo de archivo. Por ejemplo, para establecer un TTL alto para la mayoría de los medios estáticos, puede utilizar un bloque FilesMatch:

<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$"> Header set Cache-Control "max-age=63072000, public" </FilesMatch>

Si desea poner en la lista negra una ruta específica para que no sea almacenada en la caché por las CDN, puede utilizar un bloque Directory:

<Directory "/private"> Header set Cache-Control "max-age=300, private" </Directory> 

O simplemente hacer coincidir un solo archivo:

<File "protected.html"> Header set Cache-Control "max-age=300, private" </File>

Los bloques con las coincidencias más específicas tendrán prioridad sobre las coincidencias regex generales, pero querrás verificar que todo se está configurando correctamente en el extremo receptor. Puedes comprobarlo desde las DevTools de Chrome, en Encabezados de Red >.

pestaña de red de Chrome devtools

Si sólo tienes acceso a la configuración .htaccess, puedes seguir utilizando la coincidencia de directorios creando un nuevo archivo .htaccess en cada subdirectorio.

Utilizar el control sustituto para modificar el comportamiento de la CDN directamente

La cabecera Surrogate-Control funciona exactamente igual que Cache-Control, pero detalla instrucciones específicas para las CDN y los proxies inversos, en lugar de los usuarios finales. De este modo, puede indicar a las CDN que hagan una cosa, pero que envíen instrucciones diferentes al navegador.

Publicidad

Tendrá que configurar esta cabecera manualmente, de la misma manera que configuró Cache-Control:

Header set Surrogate-Control "max-age=300, public"

Definitivamente querrá probar con su CDN para verificar que esto funciona-Surrogate-Control es bastante nuevo, y no es universal.

Anthony Heddings
Anthony Heddings es el ingeniero residente en la nube de LifeSavvy Media, escritor técnico, programador y experto en la plataforma AWS de Amazon. Ha escrito cientos de artículos para How-To Geek y CloudSavvy IT que han sido leídos millones de veces.Read Full Bio »

Deja una respuesta

Tu dirección de correo electrónico no será publicada.