如何避免在没有额外查询字符串参数或使用 POST 的情况下 Internet Explorer 11缓存 AJAX

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

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

没有很好地理解的是,以前的答案都不充分。关于这一问题以前的每一个例子都被标记为已得到以下任一方面的充分回答:

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

或者

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

或者

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

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

所以,问题是:

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

29729 次浏览

缓存通常是通过在服务器返回内容时设置内容头来控制的。如果你已经在这样做了,而 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

如果你不能控制 API,你可以通过在 ajax get 中添加请求头来禁用 IE 缓存:

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