缓存是一种可以帮助网络连接更快的技术,因为需要传输的东西越少越好。
许多资源可能非常大,并且在时间和实际检索成本(例如在移动设备上)方面非常昂贵。
HTTP提供不同的缓存策略供浏览器使用 。
不缓存( No caching )
首先,通过使用no-cache值,Cache-Control头可以告诉浏览器在没有检查ETag值之前不要使用资源的缓存版本:
Cache-Control: no-cache
一个更严格的无存储选项告诉浏览器(和所有中间网络设备)甚至不存储资源在它的缓存:
Cache-Control: no-store
如果cache-control有max-age值,这是用来确定该资源作为缓存有效的秒数:
Cache-Control: max-age=3600
Expires 头部
当发送HTTP请求时,浏览器会根据所需的URL检查缓存中是否有该页面的副本。
如果有,它检查页面的时间。
如果HTTP响应Expires头值小于当前日期时间,则页面为新页面。
Expires头采用以下形式:
Expires: Sat, 01 Dec 2018 16:00:00 GMT
条件GET( Conditional GET )
浏览器可以向服务器发送请求,而不是仅仅请求页面,它添加了一个If-Modified-Since头,基于它从当前缓存的页面获得的Last-Modified头值。
这告诉服务器只有在资源自该日期以来已经更新时才返回响应体(页面内容)。
否则,服务器将返回一个304 Not Modified响应。
使用If-None-Match
和ETag
Web服务器(取决于设置、页面的服务方式等)可以发送一个ETag头。
这是资源的标识符。每次资源更改时,比如更新时,ETag也应该更改。
浏览器发送一个If-None-Match
,其中包含一个(或多个)ETag值。
如果没有匹配,服务器返回资源的新版本,否则返回304 Not Modified响应。