IE 9+忽略ETag值更改并返回缓存响应

时间:2014-07-07 07:16:10

标签: internet-explorer caching etag

Etag提供的缓存验证功能与FF& Chrome,但IE似乎忽略了Etag值并始终返回缓存的响应。

服务器响应是:

HTTP/1.1 200 OK
Date: Mon, 07 Jul 2014 06:01:57 GMT
Content-Type: application/json
ETag: a7628382056ddd13b7e06991571fd3ad
Content-Encoding: gzip
Content-Length: 4360
客户端发送条件获取请求时

If-None-Match: 71fb49ecd6f85545693dec0e78ae2131

根本不发送请求,IE返回缓存的响应。当ETag值相同时它是透明的,但当ETag不同时它是一个问题。

对我有用的唯一解决方案是添加标题

Cache-Control: no-cache

我监控网络并强制IE验证ETag值 问题解决了!
但是我没有找到任何正式的解决方案。我使用帖子Make IE to cache resources but always revalidate作为参考,但大多数信息与我的问题无关。

如果您有其他想法或建议,请分享

1 个答案:

答案 0 :(得分:1)

Internet Explorer使用一些启发式来缓存响应。您可以在启发式缓存改进部分的Caching Improvements in Internet Explorer 9阅读更多内容:

  

如果服务器的响应中没有Last-Modified标头,   然后Internet Explorer将回退到“每个浏览器一次”   会话“重新验证行为。

  

如果响应确实具有Last-Modified时间,则启发式   到期值应该不超过间隔的某个部分   自那时以来。此分数的典型设置可能是10%。

您想要的是绕过这些启发式方法并强制IE重新验证服务器的内容。为此,请检查Make IE to cache resources but always revalidate及其答案。关键标题似乎是:

Last-Modified: Wed, 16 Feb 2011 13:52:26 GMT
Expires: -1
Cache-Control: must-revalidate, private

额外奖励:请参阅前面链接中有关不同改进的部分:

  

如果响应包含指定其他标头的Vary指令   而不是Accept-Encoding,Host或User-Agent(或者任何组合   这些)然后Internet Explorer仍将缓存响应,如果   响应包含ETAG标头。但是,这种反应将是   被视为陈旧,并且之前将发出条件HTTP请求   重用以确定缓存的副本是否有效。

虽然没有说明未指定Vary标头时会发生什么,但可能值得使用此值(请参阅this post