基于http response header的缓存技术

基础知识

1) 什么是”Last-Modified”? 

        在浏览器第一次请求web资源时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记此资源在服务期端最后被修改的时间,格式类似这样: 

        Last-Modified: Fri, 12 May 2006 18:53:33 GMT 

        客户端第二次请求此资源时,根据 HTTP 协议的规定,浏览器会向服务器传送 If-Modified-Since 报头,询问该时间之后资源是否有被修改过: 

        If-Modified-Since: Fri, 12 May 2006 18:53:33 GMT 

        如果服务器端的资源没有变化,则自动返回 HTTP 304 (Not Changed.)状态码,内容为空,这样就节省了传输数据量。当服务器端代码发生改变或者重启服务器时,则重新发出资源,返回和第一次请求时类似。从而保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。 

2) 什么是”Etag”? 

        HTTP 协议规格说明定义ETag为“被请求变量的实体值” 。 另一种说法是,ETag是一个可以与Web资源关联的记号(token)。典型的Web资源可以一个Web页,但也可能是JSON或XML文档。服务器单独负责判断记号是什么及其含义,并在HTTP响应头中将其传送到客户端,以下是服务器端返回的格式: 

        ETag: "50b1c1d4f775c61:df3" 

        客户端的查询更新格式是这样的: 

        If-None-Match: W/"50b1c1d4f775c61:df3" 

        如果ETag没改变,则返回状态304然后不返回,这也和Last-Modified一样。

听起来Last-Modified和Etag差别不太大,没错,Etag的出现就是要解决Last-Modified不能解决的一些问题,算是Last-Modified的升级版。来看看Last-Modified不能解决的下列问题:

1、周期性更改的文件且内容并不改变(仅仅改变的修改时间)。

2、有些文件修改极其频繁,也许1秒内修改了很多次,If-Modified-Since能检查到的最小单位是秒级的,所以这种修改无法判断

3、不能精确得到文件的最后修改时间

HTTP1.1之后就出现了升级版的Etag来解决上述Last-Modified不能解决的问题。

问题:虽然上述方法减少了已缓存资源的下载时间,但仍然发起了一次http请求。

3)什么是”Expires”? 

  在浏览器第一次请求web资源时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Expires的属性标记此资源在服务期端过期时间,格式类似这样:

  Expires:Tue, 17 Apr 2018 17:49:39 GMT

  当客户端再次访问该资源时,会判断资源是否过期,若资源没有过期则客户端直接使用本地缓存的资源,而不会再次发起请求。

  Status Code:206 Partial Content (from disk cache)

4)什么是”Cache-Control”? 

  Cache-Control也是标记web资源在服务期端过期时间,是http1.1新加入的header,格式类似这样:

  Cache-Control:public, max-age=43200

  当客户端再次访问该资源时,会判断资源是否过期,若资源没有过期则客户端直接使用本地缓存的资源,而不会再次发起请求。

  Status Code:206 Partial Content (from disk cache)

  

  Cache-Control还有一个常用的值:

  Cache-Control:no-cache

  该值表示不使用客户端缓存,每次访问资源都强制发送请求给服务端。

当Expires和Cache-Control同时存在时,Cache-Control的值覆盖Expires的值,为保证对于使用不同http协议版本的浏览器的兼容性,建议Expires结合Cache-Control一起使用。

原文地址:https://www.cnblogs.com/wukejia/p/8865740.html