我们有一个单独的图像服务,我们的网络应用程序用它来获取它的一些图像.图像服务经过了充分测试,运行正常.为了使其具体,我们的应用程序从domain.com提供. img元素的src元素是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,这正确地返回图像B.请注意,我不是在讨论提供图像来自获得304 Not Modified响应后的缓存,我说的是Chrome决定不再访问img src而只返回图像A.另外,在img的src属性中添加一些独特的查询字符串可以解决问题,但这是一个黑客,我们宁愿不必这样做.
值得注意的是Firefox最初也在做同样的事情.最初响应中没有Cache Control标头.我们在响应头中添加了一个Cache Control:no-cache标头(并尝试了no-store),这修复了Firefox中的行为,但是Chrome和Safari仍然提供过时的缓存图像而不调用图像的src .
看起来这是Chromium(https://code.google.com/p/chromium/issues/detail?id=103458)中的一个长期存在的错误,据称大约6周前已经修复,但我们正在使用最新版本的Chrome.
我们已经查看了答案here和here但他们实际上没有回答这个问题.
根据第14.9.1 of RFC 2616条:
If the no-cache directive does not specify a field-name,then a cache MUST NOT use the response to satisfy a subsequent request without successful revalidation with the origin server. This allows an origin server to prevent caching even by caches that have been configured to return stale responses to client requests.
除非我们遗漏某些内容或做错了什么,否则Chrome(和Safari)似乎不遵守302重定向的无缓存标头的RFC行为?任何人以前都有这种经历或有任何见解?
解决方法
我遇到了你所描述的同样令人抓狂的问题(略有不同,因为它是一个缺少cookie重定向回登录页面),除了Safari之外,它在任何地方都有效.
无奈之下,我遇到了this open WebKit bug并看到了命运的评论(最后是一线希望):
CachedRawResource now keeps the redirect chain,and has some trivial logic for checking correctness,but it’s nowhere near complete (only checks cacheControlContainsNoStore()). And of course other resource types don’t have anything.
添加了no-store到我的缓存控制头,没有更多问题.