我知道这实际上是一件旧事,但我真的对此有疑问,以及它在启动时应该如何工作。所以我至少得到了这四个可以发送回客户端的重要缓存标头(Last-Modified
,Cache-Control
,Expires
和ETag
)
问题2.2的示例情况:
所以,假设我有一些文章。
每15分钟到7天可能会有一篇新文章。
所以我将Cache-Control
和Expires
设置为缓存15分钟,以便客户端始终获得最新版本。
我现在对ETag
和Last-Modified
的看法:
我只是将内容的一些哈希值放在那里,如果304
== If-None-Match
,我可以发送客户ETag
。
如果304
> = If-Modified-Since
,我可以发送客户Last-Modified
。
问题
Cache-Control
和 Expires
来支持所有浏览器?Cache-Control
和Expires
只告诉我的浏览器内容应该在计算机上缓存多长时间?
ETag
和Last-Modified
找出我应该发送304
的权利吗?Cache-Control
和Expires
永久设置为仅在ETag
或Last-Modified
更改后才向客户端发送新版本?
ETag
和 Last-Modified
来支持所有浏览器?Pragma
看起来像另一个类似于Cache-Control
的缓存标头,浏览器使用的是Pragma
,我是否需要它?答案 0 :(得分:3)
我是否需要
Cache-Control
和Expires
支持所有浏览器?
Cache-Control
在HTTP 1.1中引入,因此仅在支持HTTP 1.1的客户端上受支持。自HTTP 1.0起支持Expires
。如果同时指定了两者,则Cache-Control
优先,Expires
完全被忽略。
看起来
Cache-Control
和Expires
只告诉我的浏览器应该在计算机上缓存内容多长时间?
基本上,是的。如果Cache-Control
不存在(因此将使用Expires
)或使用max-age
进行设置。
所以我只能使用
ETag
和Last-Modified
找出我应该发送304的权利吗?
在这里,你的问题开始令人困惑。实际上,您需要检查If-None-Match
和If-Modified-Since
标头。通常,浏览器仅在条件GET请求中发送其中一个,如果它与服务器中的当前值ETag
或Last-Modified
匹配,则返回304以及ETag
标头。请注意,如果浏览器出于某种原因发送它们,那么您可以忽略If-Modified-Since
。
所以我可以永久地设置
Cache-Control
和Expires
,如果ETag
或Last-Modified
改变了,那么只需向客户端发送新版本吗?
没有。如果将其设置为永久,则客户端将永远不会发送(条件)请求,直到按下最终用户(Ctrl)+ F5。您需要将Cache-Control: max-age
或Expires
设置为所需的缓存时间(将来可能会达到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。