提供压缩文件
在压缩请求的对象时,由于对象更小(在某些情况下,大小不到原件的四分之一),因此下载速度可能更快。更快的下载可能导致向查看器更快地呈现网页,尤其是对于 JavaScript 和 CSS 文件。此外,CloudFront 数据传输的费用基于提供的数据总量。提供压缩的对象可能比提供未压缩的对象更便宜。
配置 CloudFront 来压缩对象
要将 CloudFront 配置为压缩对象,请更新您要提供压缩对象的缓存行为。
将 CloudFront 配置为压缩对象(控制台)
-
登录 CloudFront 控制台
。 -
选择您的分配,然后选择要编辑的行为。
-
对于自动压缩对象设置,选择是。
-
使用缓存策略来指定缓存设置,并同时启用 Gzip 和 Brotli 压缩格式。
-
将缓存策略中的 TTL 设置设为大于零的值。如果您将最小 TTL 值设置为零,CloudFront 将不会缓存压缩内容。
备注
-
您必须使用缓存策略,才能使用 Brotli 压缩。Brotli 不支持旧版缓存设置。
-
要使用 Amazon CloudFormation 或 CloudFront API 启用压缩,请将
Compress
、EnableAcceptEncodingGzip
、EnableAcceptEncodingBrotli
参数设置为true
。
要了解 CloudFront 如何压缩对象,请参阅以下部分。
CloudFront 压缩的工作原理
-
查看器请求对象。查看器在请求中包含
Accept-Encoding
HTTP 标头,标头值包含gzip
、br
或同时包含二者。这表示查看器支持压缩对象。当查看器同时支持 Gzip 和 Brotli 时,CloudFront 使用 Brotli。注意
Chrome 和 Firefox Web 浏览器仅在使用 HTTPS 发送请求时才支持 Brotli 压缩。它们不支持对 HTTP 请求使用 Brotli。
-
在边缘站点,CloudFront 将检查缓存中有无所请求对象的压缩副本。
-
根据压缩对象是否在缓存中,CloudFront 执行以下操作之一:
-
如果压缩的对象已在缓存中,则 CloudFront 将该对象发送到查看器并跳过剩余步骤。
-
如果压缩的对象不在缓存中,则 CloudFront 将请求转发到源。
注意
如果缓存中已有对象的未压缩副本,CloudFront 可能会将其发送到查看器,而不将请求转发到源。例如,当 CloudFront 先前跳过了压缩时,可能会发生这种情况。发生这种情况时,CloudFront 会缓存未压缩的对象并继续处理该对象,直到对象过期、移出或失效。
-
-
如果源返回了压缩对象(通过 HTTP 响应中的
Content-Encoding
标头指示),CloudFront 将该压缩对象发送给查看器,将其添加到缓存中,并跳过剩余步骤。CloudFront 不会再次压缩对象。 -
如果源将未压缩的对象返回到 CloudFront(HTTP 响应中无
Content-Encoding
标头),则 CloudFront 将确定对象是否可压缩。有关更多信息,请参阅 当 CloudFront 压缩对象时。 -
如果对象可压缩,则 CloudFront 将压缩该对象,然后将其发送到查看器,之后将其添加到缓存中。
-
如果有对同一对象的后续查看器请求,CloudFront 将返回第一个缓存版本。例如,如果查看器请求一个使用 Gzip 压缩的特定缓存对象,而查看器接受 Gzip 格式,则对同一对象的后续请求将始终返回 Gzip 版本,即使查看器同时接受 Brotli 和 Gzip 也是如此。
某些自定义源也可以压缩对象。源也许能够压缩 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 将针对该对象的另一个请求转发到源,则当源返回 HTTP 状态代码 304 时,CloudFront 不会压缩该对象。这意味着边缘站点已有最新版本的对象。如果您希望 CloudFront 压缩已在边缘站点中缓存的对象,需要使这些对象失效。有关更多信息,请参阅使文件失效以删除内容。
- 源已配置为压缩对象
-
如果将 CloudFront 配置为压缩对象,并且源也压缩对象,则源应包含
Content-Encoding
标头。此标头向 CloudFront 表明已压缩该对象。如果来自源的响应包含Content-Encoding
标头,则无论标头的值如何,CloudFront 都不会压缩对象。CloudFront 将响应发送给查看器,并在边缘站点缓存对象。 - CloudFront 压缩的文件类型
-
有关完整列表,请参阅CloudFront 压缩的文件类型。
- CloudFront 压缩的对象大小
-
CloudFront 压缩大小介于 1000 字节和 10000000 字节之间的对象。
Content-Length
标头-
源必须在响应中包含
Content-Length
标头,CloudFront 使用它来确定对象大小是否在 CloudFront 压缩的范围内。如果Content-Length
标头缺失、包含无效值或包含超出 CloudFront 可压缩的大小范围的值,则 CloudFront 不会压缩该对象。有关 CloudFront 如何处理可能超过大小范围的大型对象的更多信息,请参阅 CloudFront 如何处理对象的部分请求 (Range GET)。。 - 响应的 HTTP 状态代码
-
CloudFront 仅在响应的 HTTP 状态代码为
200
、403
或404
时压缩对象。 - 响应没有正文
-
当来自源的 HTTP 响应没有正文时,CloudFront 没有任何可以压缩的内容。
ETag
标头-
CloudFront 有时会在压缩对象时修改 HTTP 响应中的
ETag
标头。有关更多信息,请参阅 ETag 标头转换。 - CloudFront 跳过压缩
-
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 文档中的以下页面: