1

我知道这实际上是一件古老的事情,但我确实对此有疑问,以及它在开始时应该如何工作。所以我至少得到了这四个可以发回给客户端的重要缓存头(Last-Modified、、Cache-Control和)ExpiresETag

问题 2.2 的示例情况:

因此,假设我有一些带有文章的网站。每 15 分钟到 7 天可能会有一篇新文章。所以我设置Cache-ControlExpires缓存 15 分钟,以便客户端始终获得最新版本。

我现在的想法ETag和想法Last-Modified

我只是在那里放了一些内容的哈希值,304如果If-None-Match== ,我可以发送给客户端ETag

304如果If-Modified-Since>= ,我可以发送客户端Last-Modified

问题

  1. 我是否需要Cache-Control Expires支持所有浏览器?
  2. 它看起来只是告诉我的浏览器内容应该在计算机上缓存多长时间,对吗 Cache-ControlExpires
    • 所以我只能使用ETagandLast-Modified找出我应该什么时候发送304对吗?
    • 所以我可以设置Cache-Control和永远,如果或改变 Expires了新版本,只需向客户发送新版本?ETagLast-Modified
      • 因为这适用于我的浏览器,但它适用于所有浏览器吗?
  3. 我是否需要ETag Last-Modified支持所有浏览器?
  4. Pragma看起来像另一个类似于 的缓存标头Cache-Control,哪些浏览器正在使用Pragma,我需要它吗?
4

1 回答 1

3

我是否需要Cache-ControlExpires支持所有浏览器?

Cache-Control在 HTTP 1.1 中引入,因此仅在支持 HTTP 1.1 的客户端上受支持。Expires从 HTTP 1.0 开始支持。如果两者都指定,则Cache-Control优先并Expires完全忽略。


它看起来只是告诉我的浏览器内容应该在计算机上缓存多长时间,对吗Cache-ControlExpires

基本上,是的。如果Cache-Control不存在(因此Expires将被使用)或使用max-age.


所以我只能使用ETagandLast-Modified找出我应该何时发送 304 对吗?

在这里,您的问题开始令人困惑。你实际上需要检查If-None-MatchIf-Modified-Since标题。ETag通常,浏览器在有条件的 GET 请求中只发送其中一个,如果它与服务器中的or的当前值匹配Last-Modified,则返回 304 以及ETag标头。请注意,如果浏览器出于某种原因同时发送了它们,那么您可以忽略If-Modified-Since.


所以我可以设置Cache-Control和永远,如果或改变Expires了新版本,只需向客户发送新版本?ETagLast-Modified

否。如果您将其设置为永远,客户端将永远不会发送(条件)请求,直到最终用户按下 (Ctrl)+F5。您需要将Cache-Control: max-ageor设置Expires为所需的缓存时间(可能是未来的 15 分钟?)。


因为这适用于我的浏览器,但它适用于所有浏览器吗?

注意你是如何测试的:按 F5 总是会发送一个有条件的 GET 请求。但是一个简单的页面到页面导航和表单提交(就像在现实世界中一样)不会发送有条件的 GET 请求!按 Ctrl+F5 将忽略缓存并发送全新的 GET 请求。


我是否需要 ETag 和 Last-Modified 来支持所有浏览器?

所有浏览器都支持两者。If-None-Match如果已从服务器接收到 ETag,则浏览器需要将其发回,并且浏览器需要执行有条件的 GET 请求。这对他们来说是可选的,通常仅在资源上不存在Last-Modified时才发送。ETag另请参阅RFC 2616 第 13.3.4 节


Pragma 看起来像另一个类似于 Cache-Control 的缓存头,哪些浏览器正在使用 Pragma,我需要它吗?

如果要缓存,则不需要它。仅当您不想缓存时才需要它为了覆盖 HTTP 1.0 客户端/代理,但其数量目前正在稳步下降)。


如果您熟悉 Java,或者至少可以破译它,那么您可能会发现这篇文章很有帮助:FileServiet support resume and caching and GZIP

也可以看看:

于 2013-08-26T20:26:16.370 回答