Ajax 要求Chrome绕过XmlHttpRequest的本地缓存,就像它一样';Firefox中有什么可能?

Ajax 要求Chrome绕过XmlHttpRequest的本地缓存,就像它一样';Firefox中有什么可能?,ajax,caching,google-chrome,xmlhttprequest,Ajax,Caching,Google Chrome,Xmlhttprequest,正如一些人可能已经知道的,Firefox/Chrome中存在一些由XmlHttpRequest对象启动的请求的缓存问题。这些问题意味着浏览器并没有严格遵守规则,也不会进入服务器获取新的XSLT文件(例如)。响应没有Expires标头(出于性能原因,我们无法使用它) Firefox在XHR对象“通道”中有额外的参数,您可以将value Components.interfaces.nsirest.LOAD\u BYPASS\u缓存放入该通道,以显式地转到服务器 Chrome是否存在类似的功能 让我立

正如一些人可能已经知道的,Firefox/Chrome中存在一些由XmlHttpRequest对象启动的请求的缓存问题。这些问题意味着浏览器并没有严格遵守规则,也不会进入服务器获取新的XSLT文件(例如)。响应没有Expires标头(出于性能原因,我们无法使用它)

Firefox在XHR对象“通道”中有额外的参数,您可以将value Components.interfaces.nsirest.LOAD\u BYPASS\u缓存放入该通道,以显式地转到服务器

Chrome是否存在类似的功能

让我立即阻止所有建议将时间戳添加为GET参数值或随机整数的人——我不希望服务器收到不同的URL请求。我想让它得到原始的网址。原因是我想保护服务器,使其在不需要简单静态文件时,不会收到太多不同的请求,也不会向客户端发送太多数据


若您使用生成的GET参数(如“?forcenew=12314”)点击静态文件,则第一次将呈现200个响应,对于该随机整数值的每个后续请求,将呈现304个响应。如果目标静态文件与客户端版本相同,我希望发出总是返回304的请求。顺便说一句,web浏览器应该开箱即用,但XHR对象往往根本不会去服务器询问文件是否更改。

您应该了解,etag是可以从文件内容生成的键,因此一旦服务器上的文件更改,系统将成为新的etag。显然,这将是一个服务方面的变化,这是您需要做的事情,因为您想要一个200,然后是后续的304。Chrome和FF应该尊重这些ETag,因此您不需要进行任何疯狂的客户端黑客操作。

在我工作的主要项目中,我也遇到了同样的问题。我的解决方案不是附加随机字符串或时间戳来获取请求,而是附加一个特定的字符串来获取请求

如果您有一个版本号,例如subversion修订版或类似的git/mer版本或您正在使用的任何版本,请附加该版本号。在发布新版本之前,静态文件将获得304个响应。当新版本发布时,一个200响应被授予,它将返回到愉快地生成304响应的状态。:-)

这增加了独立于浏览器的额外好处


如果你运气不好,没有修订号,那么在每次发布时补发一个并增加它。

Chrome现在支持
缓存控制:max age=0
请求HTTP头。您可以在打开
XMLHttpRequest
实例后进行设置:

xhr.setRequestHeader( "Cache-Control", "max-age=0" );
这将指示Chrome在没有重新验证的情况下不使用缓存响应


有关更多信息,请查看马克·诺丁汉和。

我理解你的想法。目前我们已将ETag发送到浏览器。问题是,在这些情况下,当请求通过XHR对象路由时,Firefox/Chrome决定根本不去服务器。问题是,在这种情况下,如何让浏览器转到服务器(绕过本地浏览器缓存)。我想等待这一悬赏的结束,以说明我们如何解决它,因为我不想让任何人受到我们解决方案的影响。我们完全按照您的建议做了:)在我们执行“重新发布”网站的那一刻,我们生成了带有该时刻时间戳的GET。我真的看不到其他的方法…有时间戳的方法很好-在工作中,我们一直在讨论从subversion迁移到git,我一直担心git没有修订号。也许我们也应该使用时间戳。:-)仅供参考,在CORs请求的情况下,添加一个如上所述的标题,将进行飞行前选项调用。