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-Since
是 GET
(或 HEAD
)请求的属性。 “If-Modified-Since
标头字段使GET
或HEAD
请求方法以所选表示的修改日期比字段值中提供的日期更近为条件。如果选择表示的数据的传输被避免那个数据没有改变。” -- RFC-7323 -- 否则,当然不会避免传输,因为这样的请求被视为普通的GET
(或HEAD
)请求。
【参考方案2】:
这是我从 AWS 得到的答案:
但是,如果您转发该特定来源的所有标头,则 请求将在没有 If-Modified-Since 的情况下每次都转到原点 标题提到[1]。请查看以下链接的摘录 更多细节:
“将所有标头转发到您的来源重要如果您配置 CloudFront 将所有标头转发到您的源,CloudFront 不会 缓存与此缓存行为关联的对象。相反,它 将每个请求发送到源。”
【讨论】:
以上是关于Cloudfront如何每次都避免If-Modified-Since标头请求的主要内容,如果未能解决你的问题,请参考以下文章
Amazon CloudFront:如何获取每个分发的每月成本明细?
使用 AWS Cloudfront 避免 CORS,并清理 SPA url