Yan*_*evi 11 etag internet-explorer caching
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
Run Code Online (Sandbox Code Playgroud)
当客户端发送条件获取请求时
If-None-Match: 71fb49ecd6f85545693dec0e78ae2131
Run Code Online (Sandbox Code Playgroud)
根本不发送请求,IE返回缓存的响应.当ETag值相同时它是透明的但是当ETag不同时它是一个问题.
对我有用的唯一解决方案是添加标题
Cache-Control: no-cache
Run Code Online (Sandbox Code Playgroud)
我监控网络并强制IE验证ETag值.
问题解决了!
但是我没有找到任何正式的解决方案.我使用帖子Make IE来缓存资源,但总是重新验证作为参考,但大多数信息与我的问题无关.
如果您有其他想法或建议,请分享
Internet Explorer 使用一些启发式方法来缓存响应。您可以在启发式缓存改进部分的 Internet Explorer 9 中的缓存改进中了解更多信息:
\n\n\n\n\n如果服务器\xe2\x80\x99s 响应中不存在\xe2\x80\x99\xe2\x80\x99,则 Internet Explorer 将回退到每个浏览器\n 会话\xe2\x80 一次\xe2\x80\x9c \x9d 重新验证行为。
\n
和:
\n\n\n\n\n如果响应确实有最后修改时间,则启发式过期值应该不超过自该时间以来的间隔的一部分。该分数的典型设置可能是 10%。
\n
您想要的是绕过这些启发式方法并强制 IE 通过服务器重新验证内容。为此,请检查使 IE 缓存资源但始终重新验证及其答案。关键标题似乎是:
\n\nLast-Modified: Wed, 16 Feb 2011 13:52:26 GMT\nExpires: -1\nCache-Control: must-revalidate, private\nRun Code Online (Sandbox Code Playgroud)\n\n奖励:另请参阅前面链接中有关不同改进的部分:
\n\n\n\n\n如果响应包含 Vary 指令,该指令指定的标头不是 Accept-Encoding、Host 或 User-Agent(或这些的任意组合),则当响应包含 ETAG 时,Internet Explorer 仍会缓存该响应标头。但是,该响应将被视为过时,并且在重用之前将发出一个条件 HTTP 请求以确定缓存的副本是否有效。
\n
虽然它没有说明未Vary指定标头时会发生什么,但可能值得使用此值(请参阅这篇文章)