本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
提供压缩文件
您可以使用 CloudFront 自动压缩某些类型的对象(文件),并在查看器(Web 浏览器或其他客户端)支持压缩对象时提供压缩对象。查看器通过 Accept-Encoding
HTTP 标头指示它们支持压缩对象。
CloudFront 可以使用 Gzip 和 Brotli 压缩格式压缩对象。当查看器支持这两种格式,并且两者都存在于所访问的缓存服务器中时,则 CloudFront 更喜欢 Brotli。如果缓存服务器中只有一种压缩格式,则将其 CloudFront 返回。
注意
Chrome 和 Firefox Web 浏览器仅在使用 HTTPS 发送请求时支持 Brotli 压缩。这些浏览器不支持带 HTTP 请求的 Brotli。
在压缩请求的对象时,由于对象更小(在某些情况下,大小不到原件的四分之一),因此下载速度可能更快。特别是对于JavaScript 和 CSS 文件,更快的下载速度可以为用户更快地呈现网页。此外,由于 CloudFront 数据传输的成本取决于所提供的数据总量,因此为压缩对象提供服务可能比提供未压缩对象便宜。
某些自定义源也可以压缩对象。你的 Origin 可能能够压缩 CloudFront 不压缩的对象(请参阅 CloudFront 压缩的文件类型)。如果您的 Origin 将压缩对象返回到 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 压缩的工作原理
当您配置 CloudFront 为压缩对象时(参见上一节),其工作原理如下:
-
查看器请求对象。查看器在请求中包含
Accept-Encoding
HTTP 标头,标头值包含gzip
、br
或同时包含二者。这表示查看器支持压缩对象。当观众同时支持 Gzip 和 Brotli 时, CloudFront 更喜欢 Brotli。注意
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 压缩大小在 1,000 字节到 1000 万字节之间的对象。
Content-Length
标头-
源必须在响应中包含
Content-Length
标头,该标头 CloudFront用于确定对象的大小是否在 CloudFront压缩范围内。如果标Content-Length
题缺失、包含无效值或包含超出 CloudFront压缩大小范围的值, CloudFront 则不会压缩对象。 - 响应的 HTTP 状态代码
-
CloudFront 仅当响应的 HTTP 状态码为、或
404
时200
403
,才会压缩对象。 - 响应没有正文
-
当来自源的 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 文档中的以下页面: