【问题标题】:Invalidate Cloudfront's cached data by passing in custom header通过传入自定义标头使 Cloudfront 缓存数据无效
【发布时间】:2018-03-09 07:52:20
【问题描述】:

我需要一些资源或大方向。

我正在研究使用 Cloudfront 来帮助解决调用我的服务时的延迟问题。

我希望能够提供缓存数据,但需要允许客户端能够指定他们何时想要绕过缓存数据并获取最新数据。

我知道我可以在查询参数中发送一个随机值来使缓存无效。但我希望能够发送一个自定义标头来做同样的事情。

理想情况下,我想将在后台创建的 Cloudfront 与 API 网关一起使用。这可能吗?还是我需要创建一个新的 CloudFront 来放置在 API Gateway 前面?

有人做过吗?有什么资源可以指点我吗?

【问题讨论】:

    标签: amazon-web-services amazon-cloudfront aws-api-gateway amazon-cloudformation


    【解决方案1】:

    您实际上无法通过传递特定标头或使用查询参数来使 CloudFront 缓存无效。那是缓存busting,而不是失效。

    您可以将 CloudFront 配置为在缓存键中包含特定标头的值,只需将该标头列入白名单以转发到源 - 即使源忽略它。

    http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html#DownloadDistValuesForwardHeaders

    但是...需要为您的 API 使用者提供绕过缓存的方法,这似乎是您的设计存在问题。使用自适应 Cache-Control 响应标头并将响应缓存在 CloudFront 中适当的时间,此问题就会消失。

    否则,聪明的人会一直绕过它,通过不断地改变这个值。

    【讨论】:

    • 因此,如果我将标头列入白名单,这意味着如果我在请求中传入该标头,Cloudfront 将绕过缓存并直接从源拉取?
    • 关闭,但不完全是……这意味着 CloudFront 会将该标头及其值视为请求缓存键的一部分,就像路径是请求缓存键的一部分一样。 GET /foo + Some-Header: buzz 将被视为与 GET /foo + Some-Header: fizz 不同的“页面”(对象),也与在没有 Some-Header 的情况下的 GET /foo 不同。每个组合都是一个不同的对象,因此Some-Header: 的每个 unique 值都被单独缓存——或者如果缓存中没有针对Some-Header: 的特定值(或不存在)的请求,则查询来源.
    • 谢谢,这很有帮助!我有另一个相关的问题。如果我使用 api 网关,我仍然对如何将其列入白名单感到有些困惑。我在这里添加了一个问题:stackoverflow.com/questions/46490508/…
    【解决方案2】:

    CloudFront 根据标头进行缓存。

    创建自定义标头并在该标头上添加白名单。 如果在缓存中未找到该值,CloudFront 将从源中获取。

    希望对你有帮助。

    编辑:

    http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/header-caching.html

    基于标头的缓存。

    【讨论】:

    • 因此,如果我将标头列入白名单,这意味着如果我在请求中传入该标头(以及标头的唯一值),Cloudfront 将绕过缓存并直接从源中提取?
    • 这可以使用api网关在后台创建的云端实现吗?
    • 是的。您可以使用 cloudfront 和您集成的任何代理后端来做到这一点。
    • 似乎不可能在 API 网关中将标头列入白名单,而无需在幕后创建的云端之上创建新的云端。
    • 添加了参考文档。如果没有,你似乎做错了什么。因为它对我有用。
    猜你喜欢
    • 2017-08-31
    • 2019-09-19
    • 1970-01-01
    • 2019-03-26
    • 2011-10-28
    • 1970-01-01
    • 2012-01-08
    • 2015-11-16
    • 1970-01-01
    相关资源
    最近更新 更多