Chrome和Safari缓存302重定向

时间:2014-03-19 02:47:38

标签: html http google-chrome caching safari

已经提出过各种各样的风味,但我还没有看到真正的答案。

我们有一个单独的图像服务,我们的网络应用程序用它来获取它的一些图像。图像服务经过了充分测试,运行正常。为了使其具体化,我们的应用程序由domain.com提供。 src元素的img元素为images.domain.com/{imageId}。图像服务检索图像的URL并发回图像的HTTP 302重定向。

该应用程序允许用户更改图像。因此,假设用户5将图片A作为个人资料图片,并决定通过上传图片B进行更改。当用户上载映像时,应用程序缓存将正确无效并更新数据库。应用程序在POST之后执行标准重定向,并且在更改图像后用户重定向到的页面中的一个元素如下所示:

 <img src="example.domain.com/5">

问题是Chrome在初始重定向或定期重新加载页面时从不调用example.domain.com/5来检索图像,它只是从浏览器缓存中提供图像A example.domain.com/5的独立调用正确返回了图片B,并且硬刷新或清除Chrome的缓存会强制Chrome请求图片的src,这会正确返回图片{{1 }}。请注意,我不是在谈到在收到B响应后从缓存中提供任何一个图片时,我说的是Chrome决定不再访问304 Not Modified img而只是返回图片src。此外,在A的{​​{1}}属性中添加一些唯一的查询字符串可以解决问题,但这是一个我们不必再做的黑客攻击。

值得注意的是,Firefox最初也在做同样的事情。最初响应中没有img标头。我们在响应标头中添加了src标头(并尝试了Cache Control),这修复了Firefox中的行为,但Chrome和Safari仍然提供过时的缓存图像,而无需调用图像Cache Control: no-cache

看起来这是Chromium(https://code.google.com/p/chromium/issues/detail?id=103458)中一个长期存在的错误,据称大约在6周前修复了,但我们使用的是最新版本的Chrome。

我们查看了答案herehere,但实际上并没有回答这个问题。

每节14.9.1 of RFC 2616

  

如果no-cache指令没有指定字段名,那么高速缓存绝不能使用响应来满足后续请求,而不能与源服务器成功重新验证。这允许源服务器甚至通过已配置为返回对客户端请求的陈旧响应的缓存来阻止缓存。

除非我们遗漏某些内容或做错事,否则Chrome(和Safari)似乎不符合no-store重定向的src标头的RFC行为?任何人以前都有这种经历或有任何见解吗?

2 个答案:

答案 0 :(得分:2)

cache-control: no-store

我遇到了你所描述的同样令人抓狂的问题(略有不同,因为它是一个缺少cookie重定向回登录页面),除了Safari之外,它在任何地方都有效。

无奈之下,我偶然发现了this open WebKit bug并看到了命运的评论(最后是一线希望):

  

CachedRawResource现在保留了重定向链,并且具有一些用于检查正确性的简单逻辑,但它远未完成(仅检查cacheControlContainsNoStore())。当然,其他资源类型也没有。

在我的no-store标题中添加了cache-control,不再有问题。

答案 1 :(得分:0)

请阅读此内容.. https://www.hochmanconsultants.com/articles/301-versus-302.shtml

Chrome有非常积极的缓存。

当您使用临时重定向时,您基本上是说实际的URL暂时不可用,因此请改用其他URL。 Chrome正确地缓存旧网址,因为它仍然有效。尝试使用301。然后Chrome应该知道原始网址不再有效。