如果服务器返回 Cache-Control=public 并且没有 Max-Age 或 Expires,代理可以永久缓存它吗?

如果服务器返回 Cache-Control=public 并且没有 Max-Age 或 Expires,代理可以永久缓存它吗?

如果服务器返回 Cache-Control=public 且没有 Max-Age 或 Expires,代理服务器可以永久缓存它吗?代理或规范是否有这些值的内置默认值?服务器这样做总是错误的吗?谢谢。

Cache-Control    public
Content-Length  10874
Content-Type      text/html; charset=utf-8
Server          Microsoft-IIS/7.0
X-Powered-By    ASP.NET
X-AspNet-Version  4.0.30319
Date              Thu, 24 Mar 2011 18:45:52 GMT

答案1

是的,代理始终具有内置默认值,绝大多数网站甚至没有提供有关可以存储多长时间的信息,因此他们必须有一个默认值,以防止更新的网站无法出现。

答案2

请记住,缓存与重新验证不同。代理服务器可以永久缓存一个对象,但每次对该对象发出请求时,都会使用原始服务器重新验证该对象(即发出 If-Modified-Since 或 If-Match 请求,允许原始服务器指示该对象未更改,而无需再次返回该对象)。如果原始服务器指示过期(即发送ExpiresCache-Control: max-age标头),代理可以认为该对象在该时间段内是“新鲜的”,这意味着它不需要重新验证它。如果对象不新鲜,则被视为“陈旧”,这意味着它必须重新验证该对象。

从技术上讲,如果原始服务器没有指示过期,代理服务器应该将对象视为过期对象,但似乎大多数代理服务器在一定时间内将对象视为新鲜对象。Squid 的默认行为似乎是

refresh_pattern .               0       20%     4320

这意味着如果服务器发送了一个Last-Modified标头,则该对象被视为新鲜,持续时间为当前修改时间与上次修改时间之差的 20%,最长为 4320 秒(3 小时),但如果Last-Modified未发送标头,则永远不会新鲜。

相关内容