HTML文档的<head>区域中加入描述文档的各类属性,这些Meta标签经常被用于标记文档不能够被缓存或者标记多长时间后过时。html
当浏览器读取到此HTML页面是,会遵循这个标记,在客户端采起针对性的缓存措施。除了直接在HTML文档里进行标记外,还能够在Web服务器端进行标记。浏览器
在客户端,经过浏览器发出第一次请求,请求某一个URL时,根据HTTP协议的规定,浏览器会向服务器传送报头(HTTP Request Header),服务器端响应同事记录相关属性标记(HTTP Response Header),服务器端的返回状态会是200,格式相似以下:缓存
HTTP/1.1 200 OK Date: Mon, 16 May 2016 04:03:15 GMT Content-Type: text/html;charset=UTF-8 Transfer-Encoding: chunked Connection: keep-alive Server: Tengine Vary: Accept-Encoding Cache-Control: must-revalidate, no-cache, private Pragma: no-cache Expires: Sun, 1 Jan 2000 01:00:00 GMT Content-Encoding: gzip
客户端第二次请求此URL时,根据HTTP协议的规定,浏览器会向服务器传送报头(HTTP Request Header),服务器端响应请求,并查询到标记文件没有发生改动,服务端返回304,浏览器收到此状态码后,直接从本地缓存中读取:服务器
HTTP/1.1 304 Not Modified Date: Mon, 16 May 2016 04:05:08 GMT Connection: keep-alive Server: Tengine Last-Modified: Tue, 05 Jan 2016 02:12:49 GMT Etag: "568b26a1-2bca" Expires: Wed, 15 Jun 2016 04:05:08 GMT Cache-Control: max-age=2592000
其中Last-Modified、Expires和ETag是页面缓存标识。网站
一、Expires(过时时间)
HTTP控制缓存的基本手段,其告诉缓存器相关副本在多长时间内是新鲜的。过了这个时间,缓存器就会向服务器发送请求,检查文档是否被修改。几乎全部缓存服务器都支持Expires属性。Expires头信息对于设置静态图片文件可缓存特别有用。由于这些图片修改不多,你能够给他们设置一个特别长的过时时间,这会是你的网站的用户相应变得很是快。spa
过时时间头信息属性值只能是HTTP格式的日期时间,其余的都会被解析成当前时间“以前”,副本会过时。记住:HTTP的日期时间必须是格林威治时间(GMT),而不是本地时间。代理
例如:Expires:Fri,30 Oct 1998 14:19:41 GMTcode
二、Cache-Control
可让网站发布者全面控制内容,并定位过时时间的限制。htm
有用的Cache-Control响应头信息包括:图片
- max-age = [秒]:缓存过时时间,基于请求时间的相对时间间隔。
- s-maxage = [秒]:与上面相似。不一样的是,它应用于共享(如代理服务器)缓存
- public:标识认证内容也能够被缓存,通常来讲,通过HTTP认证才能访问的内容,输出是自动不能够缓存的。
- no-cache:强制此请求直接发送给源服务器,而不通过本地缓存版本的校验。这对于须要认证的应用(能够和public结合)或者严格要求使用最新数据的应用。
- no-store:强制缓存在任何状况下都不要保留任何副本。
- must-revalidate:若是服务器端明确指出资源的过时时间或者保鲜时间,并且声明了资源的修改时间或者ETag之类的标识,那么就有一个问题了,在保鲜时间内,若是用到了该资源,是否是要到服务器确认一下资源是否最新的?若是服务器声明了must-revalidate,则每次使用该资源都须要确认资源新鲜性。
- proxy-pevalidate:和上面相似,只对缓存代理服务器起做用。
- Last-Modified:文档最后修改时间
在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个 Last-Modified的属性标记此文件在服务器端最后被修改的时间,格式相似这样:
Last-Modified: Tue, 05 Jan 2016 02:12:49 GMT
客户端第二次请求此URL时,根据HTTP协议的规定,浏览器会向服务器传送If-Modified-Since报头,询问该时间以后的文件是否有被修改过,例如:
If-Modified-Since: Tue, 05 Jan 2016 02:12:50 GMT
若是服务器端的资源没有变化,则自动返回HTTP304(Not Changed)状态码,内容为空,这样就节省了传输数据量。当服务器端代码发生改变或者重启服务器时,则从新发出资源,返回和第一次请求时相似。从而保证不向客户端重复发出资源,也保证当服务器有变化时,客户端可以获得最新的资源。
若是If-Modified-Since的时间比服务器当前时间(当前的请求时间request_time)还晚,会认为是个非法请求。
三、ETag
ETag是服务器生成的惟一标识符,每次副本的标签都会变化。HTTP协议规格说明定义ETag为“被请求变量的实体标记”。
服务器响应时给请求URL标记,并在HTTP响应头中将其传送到客户端,相似服务器端返回的格式,例如:
Etag: "568b26a2-88a5"
客户端的查询更新格式是这样的:
Etag: "568b26a2-88a5" If-None-Match: "568b26a2-88a5"
若是ETag没有改变,返回状态304。在客户端发出请求后,HTTP Reponse Header中包含Etag: "568b26a2-88a5" 标识,等于告诉Client端,你拿到的这个资源又表示ID:"568b26a2-88a5"。下次须要发请求并索要统一个URI时,浏览器同时发出一个If-None-Match,此时报头信息包含上次访问获得的Etag: "568b26a2-88a5"标识。
If-None-Match: "568b26a2-88a5"
这样Client端等于缓存两份,服务器端就会比对二者的ETag。若是 If-None-Match 为False,不返回200,返回304(Not Modified)。
ETag和Last-Modified都能起到文档惟一性标识的做用。
- 不常常改变的图片/页面启用缓存,使用Cache-Control:max-age属性设置一个较长的过时时间
- 按期更新的内容设置一个缓存服务器可识别的max-age属性或过时时间。
- 尽可能避免使用POST,除非万不得已,POST模式的返回内容大部分缓存服务器不会保存,而若是发送内容经过URL或GET模式发送,那么发送的内容能够缓存下来供之后使用。
- 不要在URL中加入针对每一个用户的识别信息:除非内容是针对不一样用户的。