本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
根据查询字符串参数缓存内容
一些 Web 应用程序使用查询字符串将信息发送到源。查询字符串是 Web 请求的一部分,显示在 ?
字符之后;该字符串可以包含一个或多个使用 &
字符分隔的参数。在以下示例中,查询字符串包括两个参数 color=red
和 size=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 解释为仅包含值为 largsize
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 到您的来源,则无法将自己的查询字符串参数命名为
Expires
Key-Pair-Id
、Policy
、或Signature
。 -
查询字符串参数和 CloudFront 标准日志(访问日志)
如果您启用日志记录, CloudFront 则会记录完整的 URL,包括查询字符串参数。无论您是否已配置为 CloudFront 将查询字符串转发到源,都是如此。有关 CloudFront 日志记录的更多信息,请参阅配置和使用标准日志(访问日志)。