缓存控制的默认值是多少?

Posted

技术标签:

【中文标题】缓存控制的默认值是多少?【英文标题】:What's default value of cache-control? 【发布时间】:2013-01-07 22:25:47 【问题描述】:

我的问题是:有时浏览器会过度缓存一些资源,即使我已经修改了它们。但是F5之后就一切正常了。

我整个下午都在研究这个案例。现在我完全理解了“Last-Modified”或“Cache-Control”的意义。而且我知道如何解决我的问题(只是 .js?version 或显式 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 

他们在“输入栏”时清楚地缓存它们

【问题讨论】:

【参考方案1】:

默认的缓存控制头是:Private

缓存机制可以将此页面缓存在私有缓存中,然后仅将其重新发送给单个客户端。 这是默认值。大多数代理服务器不会缓存具有此设置的页面。

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

【讨论】:

1) 为什么我在响应标头中看不到 Cache-Control : Private? 2)最大年龄=? 这不能回答问题。这回答了 IIS 6 中的默认设置。 这才是真正的答案:webmasters.stackexchange.com/questions/111298/…【参考方案2】:

如果没有缓存控制标头,浏览器每次加载新(?)页面时都会请求资源。按 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

尝试将此作为设置并检查这是否解决了浏览器未获取您更改的资源的问题。 must-revalidate 指令甚至会导致代理缓存每次都请求资源并检查 304 Not Modified 回复。

我目前正在经历类似的事情。我有一个设置 etag 的 localhost 连接,所有发生的事情是缓存从不询问。我没有设置缓存信息等。单独指定 etag 接缝会导致 FireFox 不再请求资源。所以我遇到了类似你的问题。

【讨论】:

no-cache 已经暗示它必须每次都重新验证。因此,在这种情况下,没有缓存就足够了 关于“没有缓存控制标头,浏览器每次加载新(?)页面时都会请求资源”,Google Chrome 似乎并非如此。它似乎无限期地缓存这些项目。 (我不确定其他浏览器。) Hitting F5 you invalidate (or even logically remove) any cached item within that page forcing the complete reload 不对。这只会导致浏览器检查更新的资源,它不会使当前缓存无效。但是,某些浏览器可以在按下 ctrl f5 组合时执行此操作。【参考方案3】:

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

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

【讨论】:

【参考方案4】:

浏览器通常默认启用缓存,因此cache-control 可用于自定义此行为或禁用它。

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

浏览器认为缓存响应新鲜的时间通常是相对于它上次修改的时间:

由于原始服务器并不总是提供明确的过期时间,缓存可以在未指定明确时间时分配启发式过期时间,采用使用其他头字段值(例如 Last-Modified 时间)的算法...如果响应具有 Last-Modified 头字段([RFC7232] 的第 2.2 节),则鼓励缓存使用启发式过期值,该值不超过自该时间以来间隔的一部分。该分数的典型设置可能是 10%。 [https://www.rfc-editor.org/rfc/rfc7234#section-4.2.2]

This post 详细说明了不同浏览器如何计算该值。

【讨论】:

【参考方案5】:

新鲜度生命周期是根据多个标头计算的。如果指定了“Cache-control: max-age=N”标头,则新鲜度生命周期等于 N。如果此标头不存在(通常是这种情况),则检查是否存在 Expires 标头。如果存在 Expires 标头,则其值减去 Date 标头的值确定新鲜度生命周期。最后,如果两个标头都不存在,则查找 Last-Modified 标头。如果此标头存在,则缓存的新鲜度生命周期等于 Date 标头的值减去 Last-modified 标头的值除以 10。

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

【讨论】:

新鲜度只是缓存的一个要素。不能保证这是导致使用缓存的因素。附带说明一下,此链接可以在没有国际化的情况下用于英文版。 没有规则说文件只有在设置缓存控制或过期时才会被缓存。收到状态码为 200、203、206、300、301 或 410 的响应可以由缓存存储并用于响应后续请求,但受到期机制的限制,除非缓存控制指令禁止缓存。 缓存常见问题解答的链接似乎不再存在。下次请参考英文页面。【参考方案6】:

在您的情况下,响应标头中有Etag: "0af7fcbdee3cd1:972",因此它也被缓存了。

【讨论】:

仅在发送带有匹配 ETag 的 If-None-Match 时,如果匹配则返回 304 Not Modified。

以上是关于缓存控制的默认值是多少?的主要内容,如果未能解决你的问题,请参考以下文章

kCGImageSourceShouldCache 的默认值是多少?

jQuery 的 ajax 默认超时值是多少? [复制]

TransactionScope 默认超时值是多少?

Swift 中基本布尔值的默认值是多少?

swift中填充修饰符的默认值是多少?

可空类型“int”的默认值是多少? (包括问号)?