根据请求标头缓存内容 - Amazon CloudFront
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

根据请求标头缓存内容

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

标头和分配 – 概述

默认情况下,在边缘位置缓存对象时 CloudFront 不考虑标题。如果您的 Origin 返回两个对象,并且它们的区别仅在于请求标头中的值,则仅 CloudFront 缓存该对象的一个版本。

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

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

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

  • 将所有标头转发到源

    注意

    对于旧版缓存设置 — 如果您配置为将所有标头转发 CloudFront 到您的来源,则 CloudFront 不会缓存与此缓存行为关联的对象。相反,它会将每个请求发送到源。

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

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

如需了解您可以为每个缓存行为转发的标头的当前数量配额或请求提高配额,请参阅标头的配额

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

选择缓存所基于的标头

您可以转发到源以及缓存所依 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 行为(自定义来源和 Amazon 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 要配置为基于 CORS 缓存响应,必须使用缓存策略配置 CloudFront 为转发标头。有关更多信息,请参阅使用策略

有关 CORS 和 Amazon S3 的更多信息,请参阅《Amazon Simple Storage Service 用户指南》中的启用跨源资源共享(CORS)

基于设备类型配置缓存

如果您 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-Viewer和同时设置CloudFront-Is-Tablet-Viewertrue

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

如果您 CloudFront 想根据请求中指定的语言缓存不同版本的对象,请配置 CloudFront 为将Accept-Language标头转发到您的源。

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

如果您 CloudFront 想根据请求来自的国家/地区缓存不同版本的对象,请配置 CloudFront 为将CloudFront-Viewer-Country标头转发到您的来源。 CloudFront 会自动将请求来源的 IP 地址转换为由两个字母组成的国家/地区代码。有关可按代码和国家名称排序的国家/地区代码 easy-to-use 列表,请参阅维基百科条目 ISO 316 6-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 返回它从源站获得的所有标头,但有少数例外。有关更多信息,请参阅相关主题: