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

根据请求标头缓存内容

对于 Web 分配,CloudFront 允许您选择是否希望 CloudFront 将标头转发到源并根据查看器请求中的标头值缓存指定对象的不同版本。这样,您便可以根据用户使用的设备、查看器的位置、查看器使用的语言及各种其他条件来提供内容的不同版本。对于 RTMP 分配,您不能将 CloudFront 配置为根据标头值进行缓存。

注意

对于 RTMP 分配,您无法将 CloudFront 配置为基于查看器请求中的标头缓存内容。

标头和分配 - 概述

默认情况下,CloudFront 在边缘站点中缓存对象时不考虑标头。如果源返回两个对象并且这两个对象仅有请求标头中的值不同,CloudFront 仅缓存对象的一个版本。

您可以配置 CloudFront 以将标头转发到源,这会导致 CloudFront 根据一个或多个请求标头中的值缓存某个对象的多个版本。要根据特定标头的值配置 CloudFront 以缓存对象,请为分配指定缓存行为设置。有关更多信息,请参阅基于选择的请求标头进行缓存

例如,假设 logo.jpg 的查看器请求包含自定义 Product 标头,其值为 AcmeApex。在将 CloudFront 配置为根据 Product 标头的值缓存对象时,CloudFront 将 logo.jpg 的请求转发到源并包括 Product 标头和标头值。CloudFront 为具有 Product 标头值 Acme 的请求缓存 logo.jpg 一次,并为具有标头值 Apex 的请求缓存一次。

可以在 Web 分配中配置每个缓存行为,以执行以下操作之一:

  • 将所有标头转发到源

    重要

    如果配置 CloudFront 以将所有标头转发到源,CloudFront 不会缓存与该缓存行为关联的对象。相反,它会将每个请求发送到源。

  • 转发您指定的标头的白名单。CloudFront 根据所有指定的标头中的值缓存对象。CloudFront 还会转发它默认转发的标头,但它仅根据指定的标头缓存对象。

  • 仅转发默认标头。在此配置中,CloudFront 不会根据请求标头中的值缓存您的对象。

有关您可以为每个缓存行为列入白名单的标头的当前数量限制或要请求提高限制,请参阅有关自定义标头的限制 (仅限 Web 分配)

有关使用 CloudFront 控制台更新分配以使 CloudFront 将标头转发到源的信息,请参阅更新分配。有关使用 CloudFront API 更新现有分配的信息,请参阅 Amazon CloudFront API Reference 中的更新分配

选择缓存所基于的标头

您可以转发到源以及 CloudFront 进行缓存所基于的标头取决于源是 Amazon S3 存储桶还是自定义源。

  • Amazon S3 – 您可以将 CloudFront 配置为根据特定标头的数量转发和缓存您的对象(请参阅以下例外情况列表)。但是,我们建议您避免使用 Amazon S3 源的白名单标头,除非您需要实施跨源资源共享 (CORS) 或想要通过在面向源的事件中使用 Lambda@Edge 来对内容进行个性化设置。

    • 要配置 CORS,您必须转发允许 CloudFront 为启用了跨源资源共享 (CORS) 的网站分发内容的标头。有关更多信息,请参阅将 CloudFront 配置为遵守 CORS 设置

    • 要使用转发到 Amazon S3 源的标头对内容进行个性化设置,请编写和添加 Lambda@Edge 函数,并将这些函数与由某个面向源的事件触发的 CloudFront 分配相关联。有关使用标头对内容进行个性化设置的更多信息,请参阅按国家/地区或设备类型标头个性化内容 - 示例

      我们建议您避免未用于对内容进行个性化设置的白名单标头,因为转发额外的标头可能会降低您的缓存命中率。即,CloudFront 将无法从边缘缓存来服务与所有请求中占的比例一样多的请求。

  • 自定义源 – 您可以将 CloudFront 配置为根据以下项以外的任意请求标头的值进行缓存:

    • Connection

    • Cookie – 如果希望根据 Cookie 转发和缓存,您可以在分配中使用单独的设置。有关更多信息,请参阅根据 Cookie 缓存内容

    • Host (for Amazon S3 origins)

    • Proxy-Authorization

    • TE

    • Upgrade

    您可以将 CloudFront 配置为根据 DateUser-Agent 标头中的值缓存对象,但我们建议您不要这样做。这些标头具有大量可能的值,并且基于其值的缓存操作会导致 CloudFront 将更多请求转发到源。

有关 HTTP 请求标头的完整列表以及 CloudFront 如何处理这些标头的信息,请参阅HTTP 请求标头和 CloudFront 行为 (自定义源和 S3 源)

将 CloudFront 配置为遵守 CORS 设置

如果您已在 Amazon S3 存储桶或自定义源上启用跨源资源共享 (CORS),则必须选择要转发的特定标头以遵守 CORS 设置。您必须转发的标头因源(Amazon S3 或自定义)以及是否要缓存 OPTIONS 响应而异。

Amazon S3

  • 如果要缓存 OPTIONS 响应,请执行以下操作:

    • 为默认缓存行为设置选择启用 OPTIONS 响应缓存的选项。

    • 将 CloudFront 配置为转发以下标头:OriginAccess-Control-Request-HeadersAccess-Control-Request-Method

  • 如果您不希望缓存 OPTIONS 响应,请将 CloudFront 配置为转发 Origin 标头以及源所需的任何其他标头(例如 Access-Control-Request-HeadersAccess-Control-Request-Method 或其他)。

自定义源 – 转发 Origin 标头以及源所需的任何其他标头。

您可以配置 CloudFront 通过将您的 CloudFront 分配的缓存行为中的标头加入白名单来转发标头。有关如何使用标头转发的更多信息,请参阅标头和分配 - 概述

有关 CORS 和 Amazon S3 的更多信息,请参阅 Amazon Simple Storage Service 开发人员指南 中的启用跨源资源共享

基于设备类型配置缓存

如果您希望 CloudFront 基于用户查看内容所用设备来缓存不同版本的对象,可将 CloudFront 配置为将合适的标头转发到自定义源:

  • CloudFront-Is-Desktop-Viewer

  • CloudFront-Is-Mobile-Viewer

  • CloudFront-Is-SmartTV-Viewer

  • CloudFront-Is-Tablet-Viewer

根据 User-Agent 标头值,在将请求转发到源之前,CloudFront 将这些标头的值设置为 truefalse。如果某个设备归入多个类别中,则多个值可能为 true。例如,对于一些平板电脑设备,CloudFront 可能将 CloudFront-Is-Mobile-ViewerCloudFront-Is-Tablet-Viewer 设置为 true

基于查看器的语言配置缓存

如果您希望 CloudFront 根据在请求中指定的语言缓存对象的不同版本,请对您的应用程序进行编程以在 Accept-Language 标头中包括语言,并配置 CloudFront 以将 Accept-Language 标头转发到源。

基于查看器的位置配置缓存

如果您希望 CloudFront 根据发出请求的国家/地区缓存对象的不同版本,请配置 CloudFront 以将 CloudFront-Viewer-Country 标头转发到源。CloudFront 自动将发出请求的 IP 地址转换为两个字母的国家/地区代码。要获取可按代码和国家/地区名称排序的易于使用的国家/地区代码列表,请参阅 Wikipedia 条目 ISO 3166-1 alpha-2

基于请求的协议配置缓存

如果您希望 CloudFront 根据请求的协议(HTTP 或 HTTPS)缓存对象的不同版本,请配置 CloudFront 以将 CloudFront-Forwarded-Proto 标头转发到源。

为压缩文件配置缓存

如果源支持 Brotli 压缩,您可以将 Accept-Encoding 标头添加到白名单中,并基于标头进行缓存。仅当源根据 Accept-Encoding 标头处理不同内容时,您才应基于该标头配置缓存。

根据标头进行缓存如何影响性能

在将 CloudFront 配置为根据一个或多个标头进行缓存并且标头具有多个可能的值时,CloudFront 将同一个对象的多个请求转发到源服务器。这会降低性能并增加源服务器上的负载。如果不管指定标头的值如何,源服务器均返回相同的对象,我们建议您不要将 CloudFront 配置为基于该标头进行缓存。

如果您将 CloudFront 配置为转发多个标头,只要值相同,查看器请求中的标头顺序对缓存没有影响。例如,如果一个请求包含标头 A:1,B:2,而另一个请求包含 B:2,A:1,CloudFront 只缓存对象的一个副本。

标头和标头值的大小写如何影响缓存

根据标头值进行缓存时,CloudFront 不会考虑标头名称的大小写,但是会考虑标头值的大小写:

  • 如果查看器请求同时包含 Product:Acmeproduct:Acme,CloudFront 仅缓存对象一次。它们之间唯一的差别是标头名称的大小写,这不会影响缓存。

  • 如果查看器请求同时包括 Product:AcmeProduct:acme,CloudFront 缓存对象两次,因为在一些请求中具有值 Acme,而在另一些请求中具有值 acme

CloudFront 返回到查看器的标头

将 CloudFront 配置为转发和缓存标头不会影响 CloudFront 向查看器返回哪个标头。CloudFront 返回它从源中获取的所有标头,但存在一些例外情况。有关更多信息,请参阅适用主题: