【问题标题】:IE 9+ ignores ETag value change and returns cached responseIE 9+ 忽略 ETag 值更改并返回缓存响应
【发布时间】:2014-08-27 14:25:05
【问题描述】:

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 作为参考,但大部分信息与我的问题无关。

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

【问题讨论】:

  • 您的服务器可能正在返回一个最近的Last-Modified 标头值,因此 IE 相信它在不久的将来不会改变。 no-cache 技术是有效的,您需要的唯一官方文档是RFC 2616(或superceding one)。另一种不太可靠的技术是在 URL 中包含一个从未被同一个客户端使用过的查询字符串,作为一个不好的副作用,它还会用不会被重用的东西填充缓存。

标签: internet-explorer caching etag


【解决方案1】:

Internet Explorer 使用一些启发式方法来缓存响应。您可以在 Heuristic Cache Improvements 部分的Caching Improvements in Internet Explorer 9 阅读更多信息:

如果服务器的响应中不存在 Last-Modified 标头, 那么 Internet Explorer 将回退到“每个浏览器一次” session”的重新验证行为。

和:

如果响应确实有 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 指令 比接受编码、主机或用户代理(或任何组合 这些),那么 Internet Explorer 仍将缓存响应,如果 响应包含一个 ETAG 标头。但是,该响应将是 被视为陈旧的,并且将在之前发出有条件的 HTTP 请求 重用以确定缓存的副本是否有效。

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

【讨论】:

    猜你喜欢
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 2017-09-25
    • 2014-02-10
    • 2017-03-23
    • 1970-01-01
    相关资源
    最近更新 更多