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


73

我意识到已经提出了这个问题,但是在现代REST实践中,该问题的先前迭代及其答案都不够准确或足够。这个问题需要一个明确的答案。

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

什么是容易理解的是,没有对以前的答案是足够的。关于SO的此问题的每个先前实例都被以下任一点标记为充分回答:

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

- 要么 -

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

- 要么 -

3)使用服务器传递的“ cache-control”标头。

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

因此,问题是:

在这种情况下,客户端是否真的无法采取任何措施来防止IE缓存AJAX GET请求的结果?


3
通过最佳实践,您是说要找到解决方案?“最佳做法”可能是使用您特别指出的不想使用的一种东西。
凯文B

1
如果IE忽略了缓存控制标头,则除了列出的内容外,您将无法使用其他任何东西。
凯文·B

1
需要明确的是,其他浏览器也缓存Ajax请求,而不仅仅是IE。
凯文B

1
凯文·B哪?我从未在其他(常用的)浏览器中看到这种行为
stolli 2015年

1
区别在于IE会缓存它,除非您不告诉它,在某些情况下甚至会缓存它。
凯文·B

Answers:


60

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

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Caching_FAQ

Cache-control: no-cache
Cache-control: no-store
Pragma: no-cache
Expires: 0

欣赏诚实回答的尝试,但是我担心这会使我们陷入“重复的问题/答案”领域。那好吧。我敢打赌,这个问题将被否决,我将删除并收集“对等压力”徽章;)。
stolli

根据您的问题,您提到“现代REST API”。尽管我确实同意使用“错误的” http动词或无用的参数是骇人听闻的解决方案,并且不适用于干净,不错的实现,但设置缓存控件的实际设计(因此是首选)方法是在服务器端使用HTTP此答案中提到的标题。
Alex Mazzariol

3
@stolli对于同龄人压力徽章非常重要。
凯文B

1

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

'Cache-Control': 'no-cache, no-store, must-revalidate', 'Pragma': 'no-cache', 'Expires': '0'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.