根据请求标头缓存内容 - Amazon CloudFront

根据请求标头缓存内容

对于 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 参考》中的 UpdateDistribution

选择缓存所基于的标头

您可以转发到源以及 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-Headers、和 Access-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 根据请求中指定的语言缓存对象的不同版本,请将 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 返回从源获取的所有标头,只有少数几个例外。有关更多信息,请参阅相关主题: