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

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

根据查询字符串参数缓存内容

一些 Web 应用程序使用查询字符串将信息发送到源。查询字符串是 Web 请求的一部分,显示在 ? 字符之后;该字符串可以包含一个或多个使用 & 字符分隔的参数。在以下示例中,查询字符串包括两个参数 color=redsize=large

https://d111111abcdef8.cloudfront.net/images/image.jpg?color=red&size=large

对于分发,您可以选择是否 CloudFront 要将查询字符串转发到您的来源,以及是根据所有参数还是根据所选参数缓存内容。为什么说这可能很有用? 考虑以下 示例。

假设您的网站提供五种语言。网站的全部五个版本的目录结构和文件名均相同。当用户浏览您的网站时,转发的请求 CloudFront 包含基于用户所选语言的语言查询字符串参数。您可以根据语言参数 CloudFront 将查询字符串配置为将查询字符串转发到源站并进行缓存。如果您将 Web 服务器配置为返回指定页面的与所选语言对应的版本, CloudFront 将基于语言查询字符串参数的值分别缓存各个语言版本。

在此示例中,如果您的网站的主页是main.html,则以下五个请求会 CloudFront 导致缓存main.html五次,语言查询字符串参数的每个值缓存一次:

  • https://d111111abcdef8.cloudfront.net/main.html?language=de

  • https://d111111abcdef8.cloudfront.net/main.html?language=en

  • https://d111111abcdef8.cloudfront.net/main.html?language=es

  • https://d111111abcdef8.cloudfront.net/main.html?language=fr

  • https://d111111abcdef8.cloudfront.net/main.html?language=jp

请注意以下几点:

  • 一些 HTTP 服务器不处理查询字符串参数,因此,不基于参数值返回对象的不同版本。对于这些源,如果您配置为将查询字符串参数转发 CloudFront 到源,则即使源 CloudFront 为每个参数值返回对象的相同版本, CloudFront 仍会根据参数值进行缓存。

  • 要使查询字符串参数与语言结合使用(如上述示例中所述),您必须使用 & 字符作为查询字符串参数之间的分隔符。如果您使用不同的分隔符,则可能会得到意想不到的结果,具体取决于您指定用作缓存基础的参数,以及参数在查询字符串中出现的顺序。 CloudFront

    以下示例显示了如果您使用不同的分隔符并且配置为仅基于参数 CloudFront 进行缓存,则会发生什么:color

    • 在以下请求中,根据color参数的值 CloudFront 缓存您的内容,但会将该值 CloudFront 解释为红色;size=large:

      https://d111111abcdef8.cloudfront.net/images/image.jpg?color=red;size=large

    • 在以下请求中, CloudFront 缓存您的内容,但不会基于查询字符串参数进行缓存。这是因为您配置 CloudFront 为基于color参数进行缓存,但将以下字符串 CloudFront 解释为仅包含值为 larg size e 的参数;color=red

      https://d111111abcdef8.cloudfront.net/images/image.jpg?size=large;color=red

您可以配置 CloudFront 为执行以下操作之一:

  • 完全不将查询字符串转发到源。如果您不转发查询字符串,CloudFront 不根据查询字符串参数进行缓存。

  • 将查询字符串转发到源,并基于查询字符串中的所有参数进行缓存。

  • 将查询字符串转发到源,并基于查询字符串中的指定参数进行缓存。

有关更多信息,请参阅 优化缓存

针对查询字符串转发和缓存的控制台和 API 设置

要在 CloudFront 控制台中配置查询字符串转发和缓存,请参阅中的以下设置您创建或更新分配时指定的值

要使用 CloudFront API 配置查询字符串转发和缓存,请参阅 Amazon CloudFront API 参考DistributionConfigWithTags中的以下设置:DistributionConfig

  • QueryString

  • QueryStringCacheKeys

优化缓存

当您配置 CloudFront 为基于查询字符串参数进行缓存时,可以采取以下步骤来减少 CloudFront 转发到您的源的请求数量。当 CloudFront 边缘站点为对象提供服务时,可以减少源服务器的负载并减少延迟,因为对象是从离用户更近的位置提供的。

仅基于源为其返回不同版本的对象的参数进行缓存

对于您的 Web 应用程序转发到的每个查询字符串参数 CloudFront,都会将每个参数值的请求 CloudFront转发到您的源,并为每个参数值缓存单独的对象版本。即使不论参数值如何,源始终返回相同的对象时,也是如此。对于多个参数,请求数和对象数相乘。例如,如果对象的请求有两个参数,每个参数有三个不同的值,在您遵循此部分中其他建议的情况下, CloudFront 将缓存该对象的六个版本。

我们建议您将配置 CloudFront 为仅基于您的源返回不同版本的查询字符串参数进行缓存,并根据每个参数仔细考虑缓存的优点。例如,假设您有一个零售网站。您有六种不同颜色的夹克衫的照片,夹克衫有 10 种不同的尺寸。您的夹克衫图片会显示不同颜色,但没有不同尺寸。要优化缓存,应配置 CloudFront 为仅基于颜色参数进行缓存,而不是根据大小参数进行缓存。这增加了从缓存中处理请求的可能性,从而提高了性能并减少了源站的负载。 CloudFront

始终按相同的顺序列出参数

查询字符串中参数的顺序很重要。在以下示例中,查询字符串相同,但参数的顺序不同。这会 CloudFront 导致将两个单独的 image.jpg 请求转发到您的源,并缓存对象的两个不同版本:

  • https://d111111abcdef8.cloudfront.net/images/image.jpg?color=red&size=large

  • https://d111111abcdef8.cloudfront.net/images/image.jpg?size=large&color=red

建议您始终按相同的顺序列出参数名称,例如字母顺序。

始终为参数名称和值使用相同的大小写

CloudFront 根据查询字符串参数进行缓存时,会考虑参数名称和值的大小写。在以下示例中,查询字符串相同,但参数名称和值的大小写不同。这会 CloudFront 导致将四个单独的 image.jpg 请求转发到您的源,并缓存对象的四个不同版本:

  • https://d111111abcdef8.cloudfront.net/images/image.jpg?color=red

  • https://d111111abcdef8.cloudfront.net/images/image.jpg?color=Red

  • https://d111111abcdef8.cloudfront.net/images/image.jpg?Color=red

  • https://d111111abcdef8.cloudfront.net/images/image.jpg?Color=Red

建议您为参数名称和值使用一致的大小写,例如全小写。

不要使用与签名 URL 冲突的参数名称

如果您使用签名 URL 来限制对内容的访问(如果您在分配中添加了可信的签名者),则在将 URL 的其余部分转发到您的来源之前,请 CloudFront 删除以下查询字符串参数:

  • Expires

  • Key-Pair-Id

  • Policy

  • Signature

如果您使用的是签名 URL,并且想要配置为将查询字符串转发 CloudFront 到您的来源,则无法将自己的查询字符串参数命名为ExpiresKey-Pair-IdPolicy、或Signature

查询字符串参数和 CloudFront 标准日志(访问日志)

如果您启用日志记录, CloudFront 则会记录完整的 URL,包括查询字符串参数。无论您是否已配置为 CloudFront 将查询字符串转发到源,都是如此。有关 CloudFront 日志记录的更多信息,请参阅配置和使用标准日志(访问日志)