Amazon CloudFront
开发人员指南 (API 版本 2016-09-29)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

提供压缩文件

您可以将 CloudFront 配置为在查看器请求的请求标头中包含 Accept-Encoding: gzip 时自动压缩某些类型的文件,并提供压缩文件。在压缩内容时,由于文件更小,因此下载速度更快,在某些情况下,大小不到原件的四分之一。—特别是对于 JavaScript 和 CSS 文件,更快的下载转化为向用户更快地提供网页。此外,由于 CloudFront 数据传输的费用是基于提供的数据总量,提供压缩文件比提供未压缩文件更便宜。

重要

查看器请求必须在请求标头中包含 Accept-Encoding: gzip,否则,CloudFront 不会压缩请求的文件。

如果您使用自定义或 Amazon S3 源,您可以将源配置为使用或不使用 CloudFront 压缩功能压缩文件。源可以压缩 CloudFront 无法压缩的文件类型。(请参阅 CloudFront 压缩的文件类型.) 如果源向 CloudFront 返回压缩文件,CloudFront 将根据 Content-Encoding 标头值检测到已压缩该文件,而不会再次压缩该文件。

配置 CloudFront 分配以压缩内容

要配置分配以压缩内容,您可以使用下列方法之一来更新处理压缩内容时采用的缓存行为:

使用 CloudFront 压缩内容

CloudFront 可以压缩 Amazon S3 源和自定义源的文件。在配置 CloudFront 以压缩内容时,您可指定缓存行为中的设置。

在配置 CloudFront 以压缩内容时,以下是 CloudFront 提供内容的方式:

  1. 您创建或更新 CloudFront 分配,并配置 CloudFront 以压缩内容。

  2. 查看器请求文件。查看器将 Accept-Encoding: gzip 标头添加到请求中。这表示查看器支持压缩的内容。

  3. 在边缘站点,CloudFront 将在缓存中检查请求中引用的文件的压缩版本。

  4. 如果压缩的文件已在缓存中,则 CloudFront 将文件返回到查看器并跳过剩余步骤。

  5. 如果压缩文件没有位于缓存中,则 CloudFront 将请求转发到源服务器,它可以是 Amazon S3 存储桶或自定义源。

    注意

    如果 CloudFront 在缓存中有文件的未压缩版本,它仍会将请求转发到源。

  6. 源服务器将请求文件的未压缩版本返回到 CloudFront。

  7. CloudFront 确定文件是否可压缩:

    • 文件必须是 CloudFront 可压缩的类型。

    • 文件大小必须介于 1000 和 10000000 字节之间。

    • 响应必须包含 Content-Length 标头,以便 CloudFront 可以确定文件大小是否在 CloudFront 压缩的范围内。如果缺少 Content-Length 标头,则 CloudFront 不会压缩文件。

    • 该响应不得包含 Content-Encoding 标头。

  8. 如果文件是可压缩的,则 CloudFront 将压缩文件,将压缩后的文件返回到查看器并将它添加到缓存中。

  9. 查看器将解压缩文件。

请注意以下几点:

CloudFront 压缩的文件类型

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

CloudFront 压缩的文件的大小

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

Content-Length 标头

源必须在响应中包含 Content-Length 标头,以便 CloudFront 可以确定文件大小是否在 CloudFront 压缩的范围内。如果缺少 Content-Length 标头,则 CloudFront 不会压缩文件。

Etag 标头

如果您配置 CloudFront 以压缩内容,CloudFront 将从压缩文件中删除 ETag 响应标头。如果具有 ETag 标头,则 CloudFront 和源可以使用该标头确定 CloudFront 边缘缓存中的文件版本是否与源服务器上的版本相同。但在压缩后,两个版本不再相同。因此,如果压缩文件过期,并且 CloudFront 将另一个请求转发到源,源始终将文件返回到 CloudFront,而不是返回 HTTP 状态代码 304 (Not Modified)。

当您配置 CloudFront 以压缩文件时,内容已在边缘站点

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

自定义源已配置为压缩文件

如果您配置 CloudFront 以压缩文件,并且 CloudFront 将请求转发到也配置为压缩文件的自定义源,自定义源将包含 Content-Encoding 标头,这表示已压缩源返回到 CloudFront 的文件。CloudFront 将缓存的文件返回到查看器,并在边缘站点中缓存该文件。

注意

如果响应包含 Content-Encoding 标头,则 CloudFront 不会压缩文件,而无论该值如何。

请求不包含 Accept-Encodin: gzip

如果在请求中缺少 Accept-Encoding 标头,CloudFront 将提供未压缩的内容。如果 Accept-Encoding 标头包含其他值(如 deflatesdch),则 CloudFront 先删除这些值,然后再将请求转发到源服务器。

使用 HTTP 1.0 的请求

如果对 CloudFront 的请求使用的是 HTTP 1.0,则 CloudFront 会删除 Accept-Encoding 标头并提供未压缩内容。

CloudFront 繁忙

在极少数情况下,当 CloudFront 边缘站点异常繁忙时,一些文件可能未压缩。

CloudFront 压缩的文件类型

如果您配置 CloudFront 以压缩内容,则 CloudFront 压缩在 Content-Type 标头中具有以下值的文件:

application/dash+xml

application/x-opentype

application/eot

application/x-otf

application/font

application/x-perl

application/font-sfnt

application/x-ttf

application/javascript

font/eot

application/json

font/ttf

application/opentype

font/otf

application/otf

font/opentype

application/pkcs7-mime

image/svg+xml

application/truetype

text/css

application/ttf

text/csv

application/vnd.ms-fontobject

text/html

application/vnd.apple.mpegurl

text/javascript

application/xhtml+xml

text/js

application/xml

text/plain

application/xml+rss

text/richtext

application/x-font-opentype

text/tab-separated-values

application/x-font-truetype

text/xml

application/x-font-ttf

text/x-script

application/x-httpd-cgi

text/x-component

application/x-javascript

text/x-java-source

application/x-mpegurl

vnd.apple.mpegurl

使用自定义源来压缩您的内容

CloudFront 可以使用 gzip 压缩某些类型的文件(请参阅CloudFront 压缩的文件类型)。但是,如果要压缩其他文件类型,或者要使用 gzip 之外的压缩算法(如 brotli),您可以在自己的服务器上压缩文件,然后使用 CloudFront 处理这些文件。

要使用 CloudFront 通过 gzip 之外的压缩算法处理文件,请将 CloudFront 设置为根据 Accept-Encoding 标头进行缓存。在执行该操作时,CloudFront 不会对 Accept-Encoding 标头进行任何更改,并且源可以为查看器返回相应的压缩文件。

在源将压缩文件返回到 CloudFront 时,请包含 Content-Encoding 标头以向 CloudFront 指示已压缩该文件。然后,CloudFront 会直接将压缩文件返回到查看器。

使用 Amazon S3 源来压缩您的内容

在使用 Amazon S3 存储您的内容时,您可以使用 CloudFront 压缩内容(如果要使用 gzip 压缩算法)。但是,您可能希望使用其他压缩算法(例如 brotli)以替代 gzip 或为 gzip 提供补充。

压缩文件后,您可以通过执行以下操作使用 CloudFront 处理这些文件,例如:

  • 将 CloudFront 配置为根据 Accept-Encoding 标头进行缓存。

  • 通过使用针对源请求触发的 Lambda@Edge 函数,更改 URI 以指向要返回的压缩文件(基于 Accept-Encoding 标头)。

  • 将内容编码元数据添加到存储在 S3 中的文件,以便查看器可以确定压缩文件的格式。有关更多信息,请参阅 Amazon Simple Storage Service 控制台用户指南 中的如何将元数据添加到 S3 对象?

当源服务器运行 IIS 时提供压缩文件

默认情况下,IIS 不为经由代理服务器的请求提供压缩内容,如 CloudFront。如果您使用 IIS,并且将 IIS 配置为使用 httpCompression 元素压缩内容,请将 noCompressionForProxies 属性值更改为 false,以便 IIS 将压缩内容返回到 CloudFront。

此外,如果您已经压缩对象,且该对象被请求的频率低于每隔几秒钟,您可能需要更改 frequentHitThresholdfrequentHitTimePeriod 的值。

有关更多信息,请参考 Microsoft 网站上的 IIS 文档。

当源服务器运行 NGINX 时提供压缩文件

在 CloudFront 将请求转发到源服务器时,它包含 Via 标头。这导致 NGINX 根据代理方式解释请求,并且,默认情况下,NGINX 禁用代理请求的压缩。如果您的 NGINX 版本包含 gzip_proxied 设置,请将该值更改为 any,以便 NGINX 将压缩内容返回到 CloudFront。有关更多信息,请参阅模块 ngx_http_gzip_module 的 NGINX 文档。