提供压缩文件 - Amazon CloudFront

提供压缩文件

您可以使用 CloudFront 自动压缩某些类型的对象(文件),并在查看器(Web 浏览器或其他客户端)支持压缩对象时(Web 浏览器或其他客户端)提供这些压缩对象。查看器通过 Accept-Encoding HTTP 标头指示它们支持压缩对象。

CloudFront 可以使用 Gzip 和 Brotli 压缩格式压缩对象。当查看器支持这两种格式,并且两者都存在于所访问的缓存服务器中时,CloudFront 会首选 Brotli。如果缓存服务器中只有一种压缩格式,CloudFront 会将其返回。

如果有对同一对象的后续查看器请求,CloudFront 将返回第一个缓存版本。例如,如果查看器请求一个使用 Gzip 压缩的特定对象,并且该对象已被缓存,而查看器接受 Gzip 格式,则对同一对象的后续请求将始终返回 Gzip 版本,即使查看器同时接受 Brotli 和 Gzip 也是如此。

注意

Chrome 和 Firefox Web 浏览器仅在使用 HTTPS 发送请求时支持 Brotli 压缩。这些浏览器不支持对 HTTP 请求使用 Brotli。

在压缩请求的对象时,由于对象更小(在某些情况下,大小不到原件的四分之一),因此下载速度可能更快。特别是对于 JavaScript 和 CSS 文件,更快的下载会导致向用户更快地提供网页。此外,由于 CloudFront 数据传输的费用基于提供的数据总量,因此提供压缩对象的成本将低于提供未压缩的对象。

某些自定义源也可以压缩对象。您的源也许能够压缩 CloudFront 无法压缩的对象(请参阅 CloudFront 压缩的文件类型)。如果您的源将压缩对象返回到 CloudFront,则 CloudFront 将根据是否存在 Content-Encoding 标头来检测该对象是否已压缩,而不再次压缩文件。

配置 CloudFront 来压缩对象

要将 CloudFront 配置为压缩对象,请执行下面的所有 操作来更新您要对压缩对象执行的缓存行为:

  1. 确保 Compress objects automatically(自动压缩对象)设置为 Yes(是)。(在 AWS CloudFormation 或 CloudFront API 中,将 Compress 设置为 true。)

  2. 使用缓存策略指定缓存设置,并确保 GzipBotli 设置均已启用。(在 AWS CloudFormation 或 CloudFront API 中,将 EnableAcceptEncodingGzipEnableAcceptEncodingBrotli 设置为 true。)

  3. 确保缓存策略中的 TTL 值设置为大于零的值。当您将 TTL 值设置为零时,压缩内容的缓存处于禁用状态。

要更新缓存行为,可以使用以下任一工具:

CloudFront 压缩的工作原理

当您将 CloudFront 配置为压缩对象时(请参阅上一部分),它的工作方式如下:

  1. 查看器请求对象。查看器在请求中包含 Accept-Encoding HTTP 标头,标头值包含 gzipbr 或同时包含二者。这表示查看器支持压缩对象。当查看器同时支持 Gzip 和 Botli 时,CloudFront 将首选 Botli。

    注意

    Chrome 和 Firefox Web 浏览器仅在使用 HTTPS 发送请求时支持 Brotli 压缩。这些浏览器不支持带 HTTP 请求的 Brotli。

  2. 在边缘站点,CloudFront 将检查缓存中有无所请求对象的压缩副本。

  3. 如果压缩的对象已在缓存中,则 CloudFront 将其发送到查看器并跳过剩余步骤。

    如果压缩的对象不在缓存中,则 CloudFront 将请求转发到源。

    注意

    如果缓存中已有对象的未压缩副本,CloudFront 可能会将其发送到查看器,而不将请求转发到源。例如,当 CloudFront 先前跳过了压缩时,可能会发生这种情况。发生这种情况时,CloudFront 会缓存未压缩的对象并继续处理该对象,直到对象过期、移出或失效。

  4. 如果源返回了压缩对象(通过 HTTP 响应中存在的 Content-Encoding 标头指示),CloudFront 将该压缩对象发送给查看器,将其添加到缓存中,并跳过剩余步骤。CloudFront 不会再次压缩对象。

    如果源将未压缩的对象返回到 CloudFront(HTTP 响应中无 Content-Encoding 标头),则 CloudFront 将确定对象是否可压缩。有关 CloudFront 如何确定对象是否可压缩的更多信息,请参阅以下部分。

  5. 如果对象可压缩,则 CloudFront 将压缩该对象,然后将其发送到查看器,并将其添加到缓存中。(在极少数情况下,CloudFront 可能会跳过压缩,然后将未压缩的对象发送给查看器。)

当 CloudFront 压缩对象时

以下列表提供了关于 CloudFront 何时压缩对象的详细信息。

请求使用 HTTP 1.0

如果对 CloudFront 的请求使用 HTTP 1.0,则 CloudFront 将删除 Accept-Encoding 标头,并且不会压缩响应中的对象。

Accept-Encoding 请求标头

如果 Accept-Encoding 标头在查看器请求中丢失,或者如果它不包含 gzipbr 作为值,则 CloudFront 不会压缩响应中的对象。如果 Accept-Encoding 标头包含其他值(例如 deflate),则 CloudFront 会先删除这些值,然后再将请求转发到源。

当 CloudFront 配置为压缩对象时,它自动在缓存键中和源请求中包含 Accept-Encoding 标头。

动态内容

CloudFront 并非总是压缩动态内容。有时对动态内容的响应会被压缩,有时不会。

当您将 CloudFront 配置为压缩对象时,内容已被缓存

CloudFront 在从源获取对象时压缩对象。当您将 CloudFront 配置为压缩对象时,CloudFront 不会压缩已在边缘站点中缓存的对象。此外,如果边缘站点上的缓存对象过期,并且 CloudFront 将该对象的另一个请求转发到源,则当源返回 HTTP 状态代码 304 时(这意味着,边缘站点中已有最新版本的对象),CloudFront 不会压缩该对象。如果您希望 CloudFront 压缩已在边缘站点中缓存的对象,需要使这些对象失效。有关更多信息,请参阅使文件失效以删除内容

源已配置为压缩对象

如果将 CloudFront 配置为压缩对象,并且源也压缩了对象,则源中应包含 Content-Encoding 标头,向 CloudFront 指示该对象已经压缩。如果来自源的响应包含 Content-Encoding 标头,则无论标头值如何,CloudFront 都不会压缩对象。CloudFront 将响应发送给查看器,并在边缘站点缓存对象。

CloudFront 压缩的文件类型

有关 CloudFront 压缩的文件类型的完整列表,请参阅 CloudFront 压缩的文件类型

CloudFront 压缩的对象大小

CloudFront 压缩大小介于 1000 字节和 10000000 字节之间的对象。

Content-Length 标头

源必须在响应中包含 Content-Length 标头,CloudFront 使用它来确定对象大小是否在 CloudFront 压缩的范围内。如果 Content-Length 标头丢失、包含无效值或包含超出 CloudFront 可压缩的大小范围的值,则 CloudFront 不会压缩该对象。

响应的 HTTP 状态代码

CloudFront 仅在响应的 HTTP 状态代码为 200403404 时压缩对象。

响应没有正文

当来自源的 HTTP 响应没有正文时,CloudFront 没有任何可以压缩的内容。

ETag 标头

CloudFront 有时会在压缩对象时修改 HTTP 响应中的 ETag 标头。有关更多信息,请参阅 ETag 标头转换

CloudFront 跳过压缩

CloudFront 将尽最大努力压缩对象。在极少数情况下,CloudFront 会跳过压缩。CloudFront 根据包括主机容量在内的各种因素做出此决定。如果 CloudFront 跳过对象的压缩,它会缓存未压缩的对象,并在该对象过期、被移出或失效之前继续将其提供给查看器。

CloudFront 压缩的文件类型

如果您将 CloudFront 配置为压缩对象,则 CloudFront 仅压缩 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

ETag 标头转换

当来自源的未压缩对象包含有效的强 ETag HTTP 标头并且 CloudFront 压缩该对象时,CloudFront 还会将强 ETag 标头值转换为弱 ETag,并将弱 ETag 值返回到查看器。查看器可以存储弱 ETag 值并使用它来发送带 If-None-Match HTTP 标头的条件请求。这允许查看器、CloudFront 和源将对象的压缩版本和未压缩版本视为语义等效,从而减少不必要的数据传输。

有效的强 ETag 标头值以双引号字符 (") 开头。为了将强 ETag 值转换为弱值,CloudFront 会将字符 W/ 添加到强 ETag 值的开头。

当来自源的对象包含弱 ETag 标头值(以字符 W/ 开头的值)时,CloudFront 不会修改此值,并会在从源接收此值后将它返回到查看器。

当来自源的对象包含无效的 ETag 标头值(该值不以 "W/ 开头)时,CloudFront 会删除 ETag 标头,并将对象返回到查看器而不带 ETag 响应标头。

有关更多信息,请参阅 MDN Web 文档中的以下页面: