当不能选择其他查询字符串参数或使用POST时,如何避免Internet Explorer 11中的AJAX缓存

当不能选择其他查询字符串参数或使用POST时,如何避免Internet Explorer 11中的AJAX缓存,ajax,internet-explorer,caching,Ajax,Internet Explorer,Caching,我知道有人问过这个问题,但在现代REST实践中,这个问题的先前迭代及其答案都不准确或充分。这个问题需要一个明确的答案 问题是众所周知的,IE(甚至11)缓存AJAX请求,这真的很愚蠢。每个人都明白这一点 不太清楚的是,前面的答案都不够充分。该问题的每一个先前实例均标记为已得到以下任一项的充分回答: 1) 在每个请求上使用唯一的查询字符串参数(例如unix时间戳),以便使每个请求URL唯一,从而防止缓存 --或-- 2) 使用POST而不是GET,因为IE不会缓存POST请求,除非在某些特殊情况下

我知道有人问过这个问题,但在现代REST实践中,这个问题的先前迭代及其答案都不准确或充分。这个问题需要一个明确的答案

问题是众所周知的,IE(甚至11)缓存AJAX请求,这真的很愚蠢。每个人都明白这一点

不太清楚的是,前面的答案都不够充分。该问题的每一个先前实例均标记为已得到以下任一项的充分回答:

1) 在每个请求上使用唯一的查询字符串参数(例如unix时间戳),以便使每个请求URL唯一,从而防止缓存

--或--

2) 使用POST而不是GET,因为IE不会缓存POST请求,除非在某些特殊情况下

--或--

3) 使用服务器传递的“缓存控制”标头

IMO在涉及现代RESTAPI实践的许多情况下,这些答案都不够充分或实用。RESTAPI将为POST和GET请求提供完全不同的处理程序,具有完全不同的行为,因此POST通常不是GET的合适或正确的替代方案。同样,许多API都有严格的验证,并且由于各种原因,当向查询字符串参数输入他们不期望的参数时,会产生500或400个错误。最后,我们经常与第三方或其他不灵活的REST API接口,在这些接口中,我们无法控制服务器响应提供的头,添加缓存控制头是我们力所能及的

因此,问题是:


在这种情况下,客户端真的无法阻止缓存AJAX GET请求的结果吗?

缓存通常通过在服务器返回内容时设置内容的标题来控制。如果你已经这样做了,IE忽略了它们并进行缓存,那么唯一的解决方法就是使用你问题中提到的一种缓存破坏技术。对于API,在尝试任何缓存破坏技术之前,最好确保使用了正确的缓存头


如果不控制API,则可以通过在ajax GET上添加请求头来禁用IE缓存:

'Cache-Control': 'no-cache, no-store, must-revalidate', 'Pragma': 'no-cache', 'Expires': '0'

您所说的最佳实践是指解决方案吗?“最佳实践”可能是使用您特别指出的您不想使用的内容之一。如果IE忽略缓存控制头,那么除了您列出的内容之外,没有其他东西可以使用。不过,要明确的是,其他浏览器也缓存Ajax请求,而不仅仅是IE。Kevin B哪个?我从未在另一个(常用)浏览器中见过这种行为。区别在于IE会缓存它,除非你告诉它不要,在某些情况下甚至会。感谢你诚实地尝试回答,但我担心这会让我们处于“重复问题/答案”的境地。哦,好吧。我打赌这个问题会被否决,我会删除,并收集我的“同侪压力”徽章;)。根据您的问题,您提到了“现代RESTAPI”。虽然我同意使用“错误的”http动词或无用的参数是黑客的解决方案,不应该用于干净、漂亮的实现,但实际设计的(因此,首选)设置缓存控件的方法是服务器端,并带有此答案中提到的http头。@stolli对于对等压力徽章来说太多了。
'Cache-Control': 'no-cache, no-store, must-revalidate', 'Pragma': 'no-cache', 'Expires': '0'