基于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,格式类似这样:
当客户端再次访问该资源时,会判断资源是否过期,若资源没有过期则客户端直接使用本地缓存的资源,而不会再次发起请求。
Status Code:206 Partial Content (from disk cache)
Cache-Control还有一个常用的值:
Cache-Control:no-cache
该值表示不使用客户端缓存,每次访问资源都强制发送请求给服务端。
当Expires和Cache-Control同时存在时,Cache-Control的值覆盖Expires的值,为保证对于使用不同http协议版本的浏览器的兼容性,建议Expires结合Cache-Control一起使用。