Cloudfront如何每次都避免If-Modified-Since标头请求

Posted

技术标签:

【中文标题】Cloudfront如何每次都避免If-Modified-Since标头请求【英文标题】:Cloudfront how to avoid If-Modified-Since header request everytime 【发布时间】:2017-02-19 22:14:37 【问题描述】:

AWS Cloudfront 文档说:

如果您将特定源的 TTL 设置为 0,CloudFront 仍将 缓存来自该来源的内容。然后它会发出一个 GET 请求 带有 If-Modified-Since 标头,从而为来源提供了机会 表示 CloudFront 可以继续使用缓存的内容,如果它 原点没变

我需要配置我的动态内容。我已经将 TTL 设置为 0 .. 我希望每个请求总是去 Origin。有没有办法避免这个带有 If-Modified-Since 标头的额外 GET 请求!为什么每次都有这个额外的要求!

【问题讨论】:

起源是什么?如果源返回具有适当标头的对象,CloudFront 将尊重这一点。 起源是 AWS ELB 【参考方案1】:

有没有办法避免这个额外的GET 请求

听起来好像您误解了您正在阅读的内容。不幸的是,您没有引用来源,因此很难返回并获取更多上下文;但是,这并不是指“额外”请求。

然后它将发出带有 If-Modified-Since 标头的 GET 请求

这是指每次浏览器随后请求对象时。 CloudFront 使用If-Modified-Since: 发送下一个 请求,以便您的源服务器具有返回304 Not Modified 响应的选项...它不会向响应来自浏览器的一个请求。

如果您的内容始终是动态的,请返回 Cache-Control: private, no-cache, no-store 并将最小 TTL 设置为 0。

http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html#ExpirationDownloadDist

【讨论】:

是的,内容总是动态的..我不认为在响应上设置任何东西,比如缓存控制等..会改变事情..假设浏览器发出请求去 CF ..现在 CF 首先发出If-Modified-Since 请求然后发出另一个请求.. 所以,我觉得我提到的 CF 上必须有一些配置;总是去原点 您可能会这么认为,但它仍然是正确的。提供的链接中的文档也非常清楚。如果最小 TTL 设置为 0并且源服务器发送 Cache-Control: no-cache,则 CloudFront 将“尊重标头” -- 并且不缓存内容。如果它不缓存内容,那么发送If-Modified-Since 请求将是不可能的,后续请求将简单地转到源。 我还怀疑你误解了If-Modified-Since 的工作原理。如果 CloudFront 发送对页面 If-Modified-Since 的请求,则源有两个选择:响应 200 OK 以及新内容,或响应 304 Not Modified no content,因为这是将缓存定向到使用旧内容。无论哪种方式,只发生一个请求。没有第二个请求。 首先感谢 Michael 的调查。最后两个 cmets 都有意义;但你不觉得他们有点矛盾吗?你确定 If-Modified-Since 不是 GET 请求吗?可以得到200作为响应!另外,正如我所见,您是 mysql 专家;你能快速浏览一下***.com/questions/40055423 仍然是一个GET 请求。 If-Modified-SinceGET(或 HEAD)请求的属性。 If-Modified-Since 标头字段使GETHEAD 请求方法以所选表示的修改日期比字段值中提供的日期更近为条件。如果选择表示的数据的传输被避免那个数据没有改变。” -- RFC-7323 -- 否则,当然不会避免传输,因为这样的请求被视为普通的GET(或HEAD)请求。 【参考方案2】:

这是我从 AWS 得到的答案:

但是,如果您转发该特定来源的所有标头,则 请求将在没有 If-Modified-Since 的情况下每次都转到原点 标题提到[1]。请查看以下链接的摘录 更多细节:

“将所有标头转发到您的来源重要如果您配置 CloudFront 将所有标头转发到您的源,CloudFront 不会 缓存与此缓存行为关联的对象。相反,它 将每个请求发送到源。”

【讨论】:

以上是关于Cloudfront如何每次都避免If-Modified-Since标头请求的主要内容,如果未能解决你的问题,请参考以下文章

Amazon CloudFront:如何获取每个分发的每月成本明细?

使用 AWS Cloudfront 避免 CORS,并清理 SPA url

如何使用 Android 缓存视图并避免每次都调用 onCreate

如何避免在Reactjs中每次都调用API?

如何避免每次推送或拉取代码时都添加 ssh 密钥

jQuery 循环动画每次都会暂停。如何避免停顿?