http缓存应该如何工作?

时间:2013-08-15 11:42:51

标签: http http-headers browser-cache

我知道这实际上是一件旧事,但我真的对此有疑问,以及它在启动时应该如何工作。所以我至少得到了这四个可以发送回客户端的重要缓存标头(Last-ModifiedCache-ControlExpiresETag

问题2.2的示例情况:

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

我现在对ETagLast-Modified的看法:

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

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

问题

  1. 我是否需要Cache-Control Expires来支持所有浏览器?
  2. 看起来Cache-ControlExpires只告诉我的浏览器内容应该在计算机上缓存多长时间?
    • 所以我只能使用ETagLast-Modified找出我应该发送304的权利吗?
    • 因此,我可以将Cache-ControlExpires永久设置为仅在ETagLast-Modified更改后才向客户端发送新版本?
      • 因为这适用于我的浏览器,但这适用于所有浏览器吗?
  3. 我是否需要ETag Last-Modified来支持所有浏览器?
  4. Pragma看起来像另一个类似于Cache-Control的缓存标头,浏览器使用的是Pragma,我是否需要它?

1 个答案:

答案 0 :(得分:3)

  

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

Cache-Control在HTTP 1.1中引入,因此仅在支持HTTP 1.1的客户端上受支持。自HTTP 1.0起支持Expires。如果同时指定了两者,则Cache-Control优先,Expires完全被忽略。


  

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

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


  

所以我只能使用ETagLast-Modified找出我应该发送304的权利吗?

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


  

所以我可以永久地设置Cache-ControlExpires,如果ETagLast-Modified改变了,那么只需向客户端发送新版本吗?

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


  

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

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


  

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

所有浏览器均支持。如果已经从服务器接收到浏览器并且浏览器需要执行条件GET请求,则浏览器需要通过If-None-Match发回ETag。 Last-Modified对他们来说是可选的,通常只有在资源上没有ETag时才会发送。另请参阅RFC 2616 section 13.3.4


  

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

如果要缓存,则不需要它。如果你想要缓存,你只需要它(为了覆盖HTTP 1.0客户端/代理,其人口目前正在稳步下降)。


如果您熟悉Java,或者至少可以解读它,那么您可能会发现本文很有用:FileServiet supporting resume and caching and GZIP

另见: