HTTP中的缓存的详细介绍

59 阅读2分钟

对通过HTTP协议提供的缓存选项的详细描述

缓存是一种技术,可以帮助网络连接更快,因为需要传输的东西越少越好。

许多资源可能非常大,而且在时间和实际成本方面(例如在手机上)检索起来非常昂贵。

HTTP提供了不同的缓存策略,并由浏览器使用。

不使用缓存

首先,Cache-Control 标头可以通过使用no-cache 值,告诉浏览器在不检查 ETag 值的情况下,永远不要使用一个资源的缓存版本(后面会详细介绍)。

一个限制性更强的no-store 选项告诉浏览器(和所有中间网络设备),甚至不在其缓存中存储该资源。

如果Cache-Controlmax-age 的值,这将被用来确定该资源作为缓存的有效秒数。

Cache-Control: max-age=3600

Expires 标头

当一个HTTP请求被发送时,浏览器会根据你要求的URL,检查它的缓存中是否有该网页的副本。

如果有,它就检查该页面的新鲜度

如果HTTP响应Expires 标头的值小于当前的日期时间,那么该页面就是新鲜的。

过期标头采取这种形式。

Expires: Sat, 01 Dec 2018 16:00:00 GMT

条件性GET

有不同的方法来执行条件性获取。所有这些都是基于使用If-* 请求头。

  • 使用If-Modified-SinceLast-Modified
  • 使用If-None-MatchETag

使用If-Modified-SinceLast-Modified

浏览器可以向服务器发送一个请求,而不是仅仅询问页面,而是根据从当前缓存页面得到的Last-Modified 标头值,添加一个If-Modified-Since 标头。

这告诉服务器,如果该资源在该日期后被更新,则只返回一个响应体(页面内容)。

否则,服务器会返回一个304 Not Modified 响应。

使用If-None-MatchETag

网络服务器(取决于设置、页面提供方式等)可以发送一个ETag头

那是一个资源的标识符。每次资源发生变化,例如它被更新,ETag也应随之变化。

这就像一个检查和。

浏览器发送一个If-None-Match,其中包含一个(或多个)ETag值。

如果没有匹配,服务器会返回该资源的最新版本,否则会返回304 Not Modified 响应。