正如你们中的一些人可能已经知道的那样,Firefox / Chrome中存在一些由XmlHttpRequest对象发起的请求的缓存问题。这些问题意味着浏览器不严格遵循规则,也不会转到服务器获取新的XSLT文件(例如)。响应没有Expires标头(出于性能原因,我们无法使用它)。
Firefox在XHR对象“channel”中有一个附加参数,您可以将值Component.interfaces.nsIRequest.LOAD_BYPASS_CACHE显式转到服务器。
Chrome存在类似的内容吗?
让我立即停止所有人谁会建议将时间戳添加为GET参数或随机整数的值 - 我不希望服务器获取不同的URL请求。我希望它能获得原始网址。原因是我想保护服务器免于获得太多不同的简单静态文件请求,并在不需要时向客户端发送过多数据。
如果使用生成的GET参数(如'?forcenew = 12314')命中静态文件,则每次第一次呈现200响应,对于该随机整数值的每个后续请求将呈现304。如果目标静态文件与客户端版本相同,我想发出始终返回304的请求。这就是网络浏览器应该如何开箱即用,但XHR对象往往不会去服务器询问是否更改了文件。
答案 0 :(得分:2)
在我的工作主要项目中,我遇到了同样的问题。我的解决方案不是将随机字符串或时间戳附加到GET请求,而是将特定的字符串附加到GET请求。
如果您有修订号,例如颠覆修订或同样来自git / mer或你正在使用的任何东西,追加它。在发布新版本之前,静态文件将获得304个响应。当新版本发生时,会发出一个单独的200响应,并且很快就会回复生成304响应。 : - )
这具有独立于浏览器的额外好处。
如果你运气不好并且没有修订号,那么每次发布时都要加一个并增加它。
答案 1 :(得分:1)
您应该查看Etags,etags是可以从文件内容生成的密钥,因此一旦服务器上的文件更改系统将成为新的etag。显然这将是一个服务方面的变化,这是你需要做的事情,因为你想要一个200,然后是304。 Chrome和FF应该尊重这些标签,因此您不需要做任何疯狂的客户端黑客攻击。
答案 2 :(得分:0)
Chrome现在支持Cache-Control: max-age=0
请求HTTP标头。您可以在打开XMLHttpRequest
实例后设置它:
xhr.setRequestHeader( "Cache-Control", "max-age=0" );
这将指示Chrome在未经重新验证的情况下不使用缓存响应。
有关详细信息,请查看Mark Nottingham和The State of Browser Caching, Revisited的RFC 7234 Hypertext Transfer Protocol (HTTP/1.1): Caching。