对通过HTTP协议提供的缓存选项的详细描述
缓存是一种技术,可以帮助网络连接更快,因为需要传输的东西越少越好。
许多资源可能非常大,而且在时间和实际成本方面(例如在手机上)检索起来非常昂贵。
HTTP提供了不同的缓存策略,并由浏览器使用。
不使用缓存
首先,Cache-Control 标头可以通过使用no-cache 值,告诉浏览器在不检查 ETag 值的情况下,永远不要使用一个资源的缓存版本(后面会详细介绍)。
一个限制性更强的no-store 选项告诉浏览器(和所有中间网络设备),甚至不在其缓存中存储该资源。
如果Cache-Control 有max-age 的值,这将被用来确定该资源作为缓存的有效秒数。
Cache-Control: max-age=3600
Expires 标头
当一个HTTP请求被发送时,浏览器会根据你要求的URL,检查它的缓存中是否有该网页的副本。
如果有,它就检查该页面的新鲜度。
如果HTTP响应Expires 标头的值小于当前的日期时间,那么该页面就是新鲜的。
过期标头采取这种形式。
Expires: Sat, 01 Dec 2018 16:00:00 GMT
条件性GET
有不同的方法来执行条件性获取。所有这些都是基于使用If-* 请求头。
- 使用
If-Modified-Since和Last-Modified - 使用
If-None-Match和ETag
使用If-Modified-Since 和Last-Modified
浏览器可以向服务器发送一个请求,而不是仅仅询问页面,而是根据从当前缓存页面得到的Last-Modified 标头值,添加一个If-Modified-Since 标头。
这告诉服务器,如果该资源在该日期后被更新,则只返回一个响应体(页面内容)。
否则,服务器会返回一个304 Not Modified 响应。
使用If-None-Match 和ETag
网络服务器(取决于设置、页面提供方式等)可以发送一个ETag头。
那是一个资源的标识符。每次资源发生变化,例如它被更新,ETag也应随之变化。
这就像一个检查和。
浏览器发送一个If-None-Match 头,其中包含一个(或多个)ETag值。
如果没有匹配,服务器会返回该资源的最新版本,否则会返回304 Not Modified 响应。