提供压缩文件
您可以使用 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 配置为压缩对象,请执行下面的所有 操作来更新您要对压缩对象执行的缓存行为:
-
确保 Compress objects automatically(自动压缩对象)设置为 Yes(是)。(在 AWS CloudFormation 或 CloudFront API 中,将
Compress
设置为true
。) -
使用缓存策略指定缓存设置,并确保 Gzip 和 Botli 设置均已启用。(在 AWS CloudFormation 或 CloudFront API 中,将
EnableAcceptEncodingGzip
和EnableAcceptEncodingBrotli
设置为true
。) -
确保缓存策略中的 TTL 值设置为大于零的值。当您将 TTL 值设置为零时,压缩内容的缓存处于禁用状态。
要更新缓存行为,可以使用以下任一工具:
CloudFront 压缩的工作原理
当您将 CloudFront 配置为压缩对象时(请参阅上一部分),它的工作方式如下:
-
查看器请求对象。查看器在请求中包含
Accept-Encoding
HTTP 标头,标头值包含gzip
、br
或同时包含二者。这表示查看器支持压缩对象。当查看器同时支持 Gzip 和 Botli 时,CloudFront 将首选 Botli。注意
Chrome 和 Firefox Web 浏览器仅在使用 HTTPS 发送请求时支持 Brotli 压缩。这些浏览器不支持带 HTTP 请求的 Brotli。
-
在边缘站点,CloudFront 将检查缓存中有无所请求对象的压缩副本。
-
如果压缩的对象已在缓存中,则 CloudFront 将其发送到查看器并跳过剩余步骤。
如果压缩的对象不在缓存中,则 CloudFront 将请求转发到源。
注意
如果缓存中已有对象的未压缩副本,CloudFront 可能会将其发送到查看器,而不将请求转发到源。例如,当 CloudFront 先前跳过了压缩时,可能会发生这种情况。发生这种情况时,CloudFront 会缓存未压缩的对象并继续处理该对象,直到对象过期、移出或失效。
-
如果源返回了压缩对象(通过 HTTP 响应中存在的
Content-Encoding
标头指示),CloudFront 将该压缩对象发送给查看器,将其添加到缓存中,并跳过剩余步骤。CloudFront 不会再次压缩对象。如果源将未压缩的对象返回到 CloudFront(HTTP 响应中无
Content-Encoding
标头),则 CloudFront 将确定对象是否可压缩。有关 CloudFront 如何确定对象是否可压缩的更多信息,请参阅以下部分。 -
如果对象可压缩,则 CloudFront 将压缩该对象,然后将其发送到查看器,并将其添加到缓存中。(在极少数情况下,CloudFront 可能会跳过压缩,然后将未压缩的对象发送给查看器。)
当 CloudFront 压缩对象时
以下列表提供了关于 CloudFront 何时压缩对象的详细信息。
- 请求使用 HTTP 1.0
-
如果对 CloudFront 的请求使用 HTTP 1.0,则 CloudFront 将删除
Accept-Encoding
标头,并且不会压缩响应中的对象。 Accept-Encoding
请求标头-
如果
Accept-Encoding
标头在查看器请求中丢失,或者如果它不包含gzip
或br
作为值,则 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 状态代码为
200
、403
或404
时压缩对象。 - 响应没有正文
-
当来自源的 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 文档中的以下页面: