0
HTTP/1.1 200 OK
Date: Thu, 23 Jun 2011 07:59:40 GMT
Server: Apache/2.2.16 (Amazon)
Last-Modified: Thu, 23 Jun 2011 07:28:10 GMT
ETag: "68a7f-278-4a65c06e95680"
Accept-Ranges: bytes
Content-Length: 632
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8

以上是响应的 http 标头。它没有 Cache-control 属性,但具有 Etag 和 Last-Modified 属性。浏览器如何处理这种情况?现在缓存被认为是新鲜的多久了?

4

1 回答 1

1

根据RFC 2616第 13.2.4 节:

13.2.4 到期计算

为了确定响应是新鲜的还是陈旧的,我们需要将其新鲜寿命与其年龄进行比较。年龄按
第 13.2.3 节所述计算;本节介绍如何计算
新鲜寿命,以及如何确定响应是否已过期。
在下面的讨论中,这些值可以以
适合算术运算的任何形式表示。

我们使用术语“expires_value”来表示 Expires
标头的值。我们使用术语“max_age_value”来表示响应中 Cache-Control 标头的“max-age”指令携带的秒数的适当值(参见第 14.9.3 节)。

max-age 指令优先于 Expires,因此如果响应中存在 max-age,则计算很简单:

  freshness_lifetime = max_age_value

否则,如果响应中存在 Expires,则计算为:

  freshness_lifetime = expires_value - date_value

请注意,这些计算都不会受到时钟偏差的影响,因为所有信息都来自原始服务器。

如果 Expires、Cache-Control: max-age 或 Cache-Control: s-
maxage(参见第 14.9.3 节)都没有出现在响应中,并且响应不包括其他缓存限制,缓存可以计算新鲜度使用启发式的生命周期。如果尚未添加警告,缓存必须将警告 113 附加到年龄超过 24 小时的任何响应。

此外,如果响应确实具有 Last-Modified 时间,则启发式
过期值应该不超过
自该时间以来间隔的一部分。该分数的典型设置可能是 10%。

确定响应是否过期的计算非常
简单:

  response_is_fresh = (freshness_lifetime > current_age)
于 2011-06-23T09:24:59.740 回答