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

时间:2015-08-27 23:24:16

标签: ajax internet-explorer caching

我意识到这个问题已被提出,但在现代REST实践中,此问题的先前迭代及其答案都不准确或充分。需要对这个问题给出明确的答案。

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

的理解是,以前的答案都不够。 SO上此问题的每个前一个实例都标记为:

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

- 或 -

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

- 或 -

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

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

所以,问题是:

在这种情况下,客户端是否真的无法阻止I.E.从缓存AJAX GET请求的结果?

2 个答案:

答案 0 :(得分:49)

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

https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching_FAQ

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

答案 1 :(得分:0)

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

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