缓存控件的默认值是什么?

我的问题是: 有时浏览器缓存过高的一些资源,即使我已经修改了他们。但在 F5之后,一切都很好。

我整个下午都在研究这个案子。现在我完全理解了“最后修改”或“缓存控制”的意义。我知道如何解决我的 问题(只是。或者显式的 max-age = xxxx)。但是 问题仍然没有解决: 浏览器是如何处理响应头 没有“ Cache-Control”的:

Content-Length: 49675
Content-Type: text/html
Last-Modified: Thu, 27 Dec 2012 03:03:50 GMT
Accept-Ranges: bytes
Etag: "0af7fcbdee3cd1:972"
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Date: Thu, 24 Jan 2013 07:46:16 GMT

他们在“进入酒吧”时显然会缓存

enter image description here

62601 次浏览

默认的缓存控件头是: 二等兵

缓存机制可以将此页缓存在私有缓存中,并只将其重新发送到单个客户端。大多数代理服务器不会缓存具有此设置的页面。

请参阅 http://msdn.microsoft.com/en-us/library/ms524721%28v=vs.90%29.aspx

如果没有缓存控件标头,浏览器每次加载新的(?)时都会请求资源呼叫。点击 F5将使页面中的任何缓存项失效(甚至逻辑上移除) ,因为没有本地版本可用,从而强制完全重新加载——我不确定浏览器是否在再次请求之前从缓存中移除了这些资源。

有趣的是,在一些浏览器中存在一些“附加”设置,这些设置会导致一些优化,比如每页加载只请求一次资源。如果您有一个像计数器一样对每个请求都进行更改的图像,那么即使多次使用该图像,您也只能看到该图像的一个版本。

下一个问题是浏览器通过应用某种本地“首选”缓存来重用没有显式设置为 nocache 的图像。如果每次需要将请求设置为重新验证并将过期值设置为 -1或类似的值时,都需要有一个请求。

因此,根据不指定任何内容的资源,通常会触发一些默认值,这些默认值与您在阅读规范时期望的不同。

对于源是本地的、驱动器的还是真正的远程因特网服务器,也可能存在不同的行为。可以说,并非所有的浏览器都有不同的表现,而我的表现相当有限。

你可以登录 www.google.com,查找他们页面请求的跟踪像素(从子域中随机部分的 metrics.gstats.com 请求的两个1x1像素)。

如果您使用 firebug 检出头部,您会看到它们以任何可能的方式指定 nocache 指令。标题是这样的:

Alternate-Protocol  443:quic
Cache-Control   no-cache, must-revalidate
Content-Length  35
Content-Type    image/gif
Date    Mon, 25 Nov 2013 14:33:30 GMT
Expires Fri, 01 Jan 1990 00:00:00 GMT
Last-Modified   Tue, 14 Aug 2012 10:47:46 GMT
Pragma  no-cache
Server  sffe
X-Content-Type-Options  nosniff
X-Firefox-Spdy  3
X-XSS-Protection    1; mode=block

尝试将此设置作为一个设置,并检查这是否解决了浏览器未拾取已更改资源的问题。“必须重新验证”指令甚至会导致代理缓存每次都请求一个资源,并检查是否有304个未修改的答复。

我现在也有类似的经历。我有一个设置 etag 的本地主机连接,所发生的一切就是缓存从不询问。我没有设置缓存信息或类似的信息。单独指定一个 etag 接缝会导致 FireFox 不再请求资源。所以我经历了和你类似的问题。

RFC 7234 详细说明了浏览器和代理在默认情况下应该做什么:

虽然缓存是 HTTP 的一个完全可选的特性,但它可以是 假设重用缓存的响应是可取的,并且 当没有需求或本地时,重用是默认行为 因此,HTTP 缓存需求是 专注于防止缓存存储不可重用的 响应或不适当地重用存储的响应,而不是 要求缓存总是存储和重用特定的响应。

缓存通常在浏览器中默认启用,因此可以使用 cache-control自定义这种行为或禁用它。

虽然缓存是 HTTP 的一个完全可选的特性,但是可以假设重用缓存的响应是可取的,并且当没有需求或本地配置阻止时,这种重用是默认行为。因此,HTTP 缓存需求侧重于防止缓存存储不可重用的响应或不适当地重用存储的响应,而不是强制要求缓存始终存储和重用特定的响应。Https://www.rfc-editor.org/rfc/rfc7234#section-2

浏览器考虑缓存响应的新鲜时间通常与最后一次修改它的时间相关:

由于原始服务器并不总是提供明确的过期时间,当没有指定明确的时间时,缓存可能会分配一个启发式过期时间,使用使用其他头字段值(如最后修改的时间)的算法... 如果响应有一个最后修改的头字段([ RFC7232]的第2.2节) ,鼓励缓存使用一个启发式过期值,不超过自那时起的一部分时间间隔。这个分数的典型设置可能是10% 。Https://www.rfc-editor.org/rfc/rfc7234#section-4.2.2

这篇文章 详细介绍了不同浏览器是如何计算这个值的。

新鲜度寿命是根据几个头计算的。如果指定了“ Cache-control: max-age = N”头,则新鲜度生存期等于 N。如果这个报头不存在(这种情况经常发生) ,则检查是否存在 Exires 报头。如果存在一个过期报头,那么它的值减去 Date 报头的值就决定了新鲜度的生命周期。最后,如果两个头都不存在,则查找 Last-Amendment 头。如果存在此标头,则缓存的新鲜度生存期等于 Date 标头的值减去 Last 修改标头的值除以10。

资料来源: https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching#Freshness

在您的例子中,在响应头中有 Etag: "0af7fcbdee3cd1:972",因此它也被缓存。