Ofrecimiento de archivos comprimidos - Amazon CloudFront

Ofrecimiento de archivos comprimidos

Puede utilizar CloudFront para comprimir automáticamente ciertos tipos de objetos (archivos) y servir los objetos comprimidos cuando los lectores (navegadores web u otros clientes) los admiten. Los lectores indican la compatibilidad de estos objetos comprimidos con el encabezado HTTP Accept-Encoding.

CloudFront puede comprimir los objetos con los formatos de compresión Gzip y Brotli. Cuando el lector admite ambos formatos, y los dos están presentes en el servidor de caché al que se conecta, CloudFront prefiere Brotli. Si solo hay un formato de compresión en el servidor de caché, CloudFront lo devuelve.

Si hay solicitudes de lector posteriores para el mismo objeto, CloudFront devuelve la primera versión almacenada en caché. Por ejemplo, si un lector solicita un objeto específico que utiliza la compresión Gzip y el objeto se almacena en caché, y el lector acepta el formato Gzip, las solicitudes posteriores al mismo objeto devolverán siempre la versión Gzip, aunque el lector acepte tanto Brotli como Gzip.

nota

Los navegadores web Chrome y Firefox admiten compresión Brotli solo cuando la solicitud se envía mediante HTTPS. Estos navegadores no admiten Brotli con solicitudes HTTP.

Al comprimir los objetos solicitados, las descargas son más rápidas, ya que los objetos son más pequeños: en algunos casos, menos de una cuarta parte del original. Especialmente para archivos CSS y JavaScript, descargas más rápidas pueden resultar en páginas web que se muestran más rápido a los usuarios. Además, como el costo de transferencia de datos de CloudFront se basa en la cantidad total de datos que se atienden, enviar objetos comprimidos puede ser más económico que distribuirlos sin comprimir.

Algunos orígenes personalizados también pueden comprimir objetos. Es posible que su origen pueda comprimir objetos que CloudFront no comprime (consulte Tipos de archivos que CloudFront comprime). Si el origen devuelve un objeto comprimido a CloudFront, CloudFront detecta que el objeto se ha comprimido en función de la presencia de un encabezado Content-Encoding y no comprime el objeto de nuevo.

Configuración de CloudFront para comprimir objetos

Si quiere configurar CloudFront para comprimir objetos, actualice el comportamiento de la caché al que desea ofrecer objetos comprimidos y cumpla con todas las siguientes instrucciones:

  1. Asegúrese de que la configuración Compress Objects Automatically (Comprimir objetos automáticamente) diga Yes (Sí). (En AWS CloudFormation o en la API de CloudFront, establezca Compress en true).

  2. Utilice una política de caché para especificar la configuración de almacenamiento en caché y asegúrese de que la configuración de Gzip y Brotli estén habilitadas. (En AWS CloudFormation o en la API de CloudFront, establezca EnableAcceptEncodingGzip y EnableAcceptEncodingBrotli en true).

  3. Asegúrese de que los valores TTL de la política de caché estén establecidos en un valor superior a cero. Cuando establece los valores TTL en cero, el almacenamiento en caché de contenido comprimido se desactiva.

Para actualizar un comportamiento de caché, puede utilizar cualquiera de las siguientes herramientas:

Cómo funciona la compresión de CloudFront

Cuando configura CloudFront para comprimir objetos (consulte la sección anterior), así es como funciona:

  1. Un espectador solicita un objeto. El lector incluye el encabezado HTTP Accept-Encoding en la solicitud, y los valores de encabezado incluyen gzip, br o ambos. Esto indica que el lector admite objetos comprimidos. Cuando el lector admite tanto Gzip como Brotli, CloudFront prefiere Brotli.

    nota

    Los navegadores web Chrome y Firefox admiten compresión Brotli solo cuando la solicitud se envía mediante HTTPS. Estos navegadores no admiten Brotli con solicitudes HTTP.

  2. En la ubicación de borde, CloudFront verifica la caché en busca de una versión comprimida del objeto solicitado.

  3. Si el objeto comprimido ya está en la caché, CloudFront lo devuelve al lector y omite los demás pasos.

    Si el objeto comprimido no se encuentra en la caché, CloudFront reenvía la solicitud al origen.

    nota

    Si una copia sin comprimir del objeto ya está en la caché, CloudFront podría enviarla al lector sin reenviar la solicitud al origen. Por ejemplo, esto puede ocurrir cuando CloudFront omitió previamente la compresión. Cuando esto sucede, CloudFront almacena en caché el objeto sin comprimir y continúa atendiéndolo hasta que el objeto se vence, desaloja o invalida.

  4. Si el origen devuelve un objeto comprimido, como indica la presencia de un encabezado Content-Encoding en la respuesta HTTP, CloudFront envía el objeto comprimido al lector, lo agrega a la caché y omite el paso restante. CloudFront no comprime de nuevo el objeto.

    Si el origen devuelve un objeto sin comprimir a CloudFront (no existe Content-Encoding en la respuesta HTTP), CloudFront determina si el objeto se puede comprimir. Para obtener más información acerca de cómo CloudFront determina si un objeto se comprime, consulte la siguiente sección.

  5. Si el objeto se puede comprimir, CloudFront lo comprime, lo devuelve comprimido al lector y lo agrega a la caché. (En contadas ocasiones, CloudFront podría omitir la compresión y enviar el objeto sin comprimir al lector).

Cuándo CloudFront comprime objetos

En la siguiente lista, se proporciona más información acerca de cuándo CloudFront comprime objetos.

La solicitud utiliza HTTP 1.0

Si una solicitud a CloudFront utiliza HTTP 1.0, CloudFront elimina el encabezado Accept-Encoding y no comprime el objeto en la respuesta.

Encabezado de solicitud Accept-Encoding

Si el encabezado Accept-Encoding no se encuentra en la solicitud de lector o si no contiene gzip o br como valor, CloudFront no comprime el objeto en la respuesta. Si el encabezado Accept-Encoding incluye valores adicionales como deflate, CloudFront los elimina antes de reenviar la solicitud al servidor de origen.

Cuando CloudFront se configura para comprimir objetos, incluye el encabezado Accept-Encoding en la clave de caché y en las solicitudes de origen de forma automática.

Contenido dinámico

CloudFront no siempre comprime el contenido dinámico. A veces, las respuestas para el contenido dinámico se comprimen y, otras veces, no.

El contenido ya está almacenado en caché al configurar CloudFront para comprimir objetos

CloudFront comprime los objetos cuando los obtiene del origen. Al configurar CloudFront para comprimir objetos, CloudFront no comprime los objetos que ya se han almacenado en caché en ubicaciones de borde. Además, cuando un objeto se vence en una ubicación de borde y CloudFront envía otra solicitud del objeto al origen, CloudFront no comprime el objeto si el origen devuelve un código de estado HTTP 304, que significa que la ubicación de borde ya tiene la última versión del objeto. Si desea que CloudFront comprima los objetos que ya se han almacenado en ubicaciones de borde, tiene que invalidar esos objetos. Para obtener más información, consulte Invalidación de archivos para eliminar el contenido.

El origen ya está configurado para comprimir objetos

Si configura CloudFront para comprimir objetos y el origen también comprime objetos, el origen debe incluir un encabezado Content-Encoding, que indica que el objeto ya está comprimido. CloudFront no comprime un objeto si la respuesta incluye un encabezado Content-Encoding, independientemente del valor del encabezado. CloudFront envía la respuesta al lector y almacena en caché el objeto en la ubicación de borde.

Tipos de archivos que CloudFront comprime

Para obtener una lista completa de los tipos de archivo que CloudFront comprime, consulte Tipos de archivos que CloudFront comprime.

Tamaño de los objetos que comprime CloudFront

CloudFront comprime objetos con tamaños entre 1000 y 10 000 000 bytes.

Content-LengthEncabezado

El origen debe incluir un encabezado Content-Length en la respuesta para que CloudFront lo use a fin de determinar si el tamaño del objeto se encuentra en el rango que comprime. Si falta el encabezado Content-Length, si contiene un valor no válido o uno fuera del rango de tamaños que CloudFront comprime, CloudFront no comprime el objeto.

Código de estado HTTP de la respuesta.

CloudFront comprime los objetos solo cuando el código de estado HTTP de la respuesta es 200, 403 o 404.

La respuesta no tiene cuerpo

Cuando la respuesta HTTP del origen no tiene cuerpo, no hay nada para que CloudFront comprima.

ETagEncabezado

CloudFront a veces modifica el encabezado ETag en la respuesta HTTP cuando comprime objetos. Para obtener más información, consulte Conversión de encabezado ETag.

CloudFront omite la compresión

CloudFront comprime los objetos sobre la base del mejor esfuerzo. En contadas ocasiones, CloudFront omite la compresión. CloudFront toma esta decisión basándose en una serie de factores, como la capacidad del host. Si CloudFront omite la compresión de un objeto, almacena en caché el objeto sin comprimir y continúa atendiéndolo hasta que el objeto se vence, expulsa o invalida.

Tipos de archivos que CloudFront comprime

Si configura CloudFront para comprimir objetos, CloudFront comprime solo los objetos que tienen uno de los siguientes valores en el encabezado de respuesta Content-Type:

  • application/dash+xml

  • application/eot

  • application/font

  • application/font-sfnt

  • application/javascript

  • application/json

  • application/opentype

  • application/otf

  • application/pdf

  • application/pkcs7-mime

  • application/protobuf

  • application/rss+xml

  • application/truetype

  • application/ttf

  • application/vnd.apple.mpegurl

  • application/vnd.mapbox-vector-tile

  • application/vnd.ms-fontobject

  • application/wasm

  • application/xhtml+xml

  • application/xml

  • application/x-font-opentype

  • application/x-font-truetype

  • application/x-font-ttf

  • application/x-httpd-cgi

  • application/x-javascript

  • application/x-mpegurl

  • application/x-opentype

  • application/x-otf

  • application/x-perl

  • application/x-ttf

  • font/eot

  • font/opentype

  • font/otf

  • font/ttf

  • image/svg+xml

  • text/css

  • text/csv

  • text/html

  • text/javascript

  • text/js

  • text/plain

  • text/richtext

  • text/tab-separated-values

  • text/xml

  • text/x-component

  • text/x-java-source

  • text/x-script

  • vnd.apple.mpegurl

Conversión de encabezado ETag

Cuando el objeto sin comprimir del origen incluye un encabezado HTTP ETag válido y seguro, y CloudFront comprime el objeto, CloudFront también convierte el valor de encabezado ETag fuerte en uno ETag débil y devuelve el valor ETag débil al lector. Los lectores pueden almacenar el valor ETag débil y utilizarlo para enviar solicitudes condicionales con el encabezado HTTP If-None-Match. Esto permite a los lectores, a CloudFront y al origen tratar las versiones comprimidas y no comprimidas de un objeto como semánticamente equivalentes, lo que reduce la transferencia de datos innecesaria.

Un valor de encabezado ETag válido y fuerte comienza con un carácter de comillas dobles ("). Para convertir el valor ETag fuerte en uno débil, CloudFront agrega los caracteres W/ al principio del valor ETag fuerte.

Cuando el objeto del origen incluye un valor de encabezado ETag débil (un valor que comienza con los caracteres W/), CloudFront no modifica este valor y lo devuelve al lector tal como se ha recibido del origen.

Cuando el objeto del origen incluye un valor de encabezado ETag no válido (el valor no comienza por " ni por W/), CloudFront elimina el encabezado ETag y devuelve el objeto al lector sin el encabezado de respuesta ETag.

Para obtener más información, consulte las páginas siguientes en los documentos web de MDN: