缓存控制标头"no- cache,must revalidate,private“允许浏览器缓存资源,但强制使用条件请求进行重新验证。这在FF、Safari和Chrome中都能正常工作。
但是,IE7+8不发送条件请求,也就是说,请求报头中缺少“If-Modified- send”,因此服务器使用HTTP/200而不是HTTP/304进行响应。
下面是完整的服务器响应头:
Last-Modified: Wed, 16 Feb 2011 13:52:26 GMT
Content-type: text/html;charset=utf-8
Content-Length: 10835
Date: Wed, 16 Feb 2011 13:52:26 GMT
Connection: keep-alive
Cache-Control: no-cache, must-revalidate, private
这看起来像是IE的bug,但我还没有在网上找到任何相关的东西,所以我想知道是否另一个头文件的缺失或存在会使IE的行为变得奇怪?
很好地讨论了无缓存和最大年龄之间的区别:What's the difference between Cache-Control: max-age=0 and no-cache?
发布于 2011-02-22 21:48:58
我终于想通了。这里有一个解释和一个经过测试的解决方案。
下面的站点证实了我的观察结果:http://blog.httpwatch.com/2008/10/15/two-important-differences-between-firefox-and-ie-caching/
它指出IE不在本地存储带有'no-cache‘指令的页面,因此总是发送一个无条件的请求。
还有一篇MS支持文章- https://support.microsoft.com/help/234067/ -证实了这一点:
Internet Explorer支持HTTP 1.1 Cache-Control标头,该标头可在指定no-cache值时阻止对特定Web资源的所有缓存...
这种行为并不是完全错误的--但它不是RFC 2616 (sec.14.9.1)计划。关于“no- cache”,它说“……缓存在没有成功与源服务器重新验证的情况下,不能使用响应来满足后续请求。”所以响应可以被缓存,但必须重新验证它。除了IE之外,大多数浏览器都会缓存响应并重新验证它。为了防止存储请求,这里有“no-store”Cache-Control指令。
总而言之,IE将“no-cache”视为“no-store”。
下面是以一致的方式为IE和其他浏览器启用条件请求的解决方案:
不要使用no-cache,而是将Expires头设置为过去(或-1,效果相同)。IE和其他主要浏览器都会发送有条件的请求。(请注意,您还应注意IE Vary错误,它会阻止缓存。)
以下是关键的报头字段:
Last-Modified: Wed, 16 Feb 2011 13:52:26 GMT
Expires: -1
Cache-Control: must-revalidate, private
由于validator
发布于 2011-08-05 00:05:19
$last_modified = filemtime($_SERVER['SCRIPT_FILENAME']);
session_cache_limiter(FALSE);
header("Content-Type: text/css");
header("Cache-Control: max-age=1, must-revalidate, private");
header("Last-Modified: " . gmdate("D, d M Y H:i:s", $last_modified) . " GMT");
if(isset($_SERVER["HTTP_IF_MODIFIED_SINCE"]))
{
if(strtotime($_SERVER["HTTP_IF_MODIFIED_SINCE"]) >= $last_modified)
{
header("HTTP/1.1 304 Not Modified");
exit;
}
}
https://stackoverflow.com/questions/5017454
复制相似问题