缓存:
缓存是指代理服务器或客户端本地磁盘内保存的资源副本。利用缓存可减少对源服务器的访问,因此也就节省了通信量和通信时间。 (缓存服务器是代理服务器的一种,并归类在缓存代理类型中。换句话 说,当代理转发从服务器返回的响应时,代理服务器将会保存一份资 源的副本。)
缓存的时效性:
使用缓存的是有条件的,首先需要满足缓存的内容与当前最新的资源是一致的,那么本次使用缓存的响应才是有意的。 所以,即使存在缓存也会在客户端的要求、缓存的有效期的因素,向源服务器确认资源的有效性。若判定缓存失效,则客户端或者缓存服务器=>向源服务器发送请求获取“新”资源。
http中与缓存相关的首部字段
四种字段类型
通用首部字段(General Header Fields) 请求报文和响应报文两方都会使用的首部。
请求首部字段(Request Header Fields) 从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加 内容、客户端信息、响应内容相关优先级等信息。
响应首部字段(Response Header Fields) 从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加 内容,也会要求客户端附加额外的内容信息。
实体首部字段(Entity Header Fields) 针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更 新时间等与实体有关的信息。
重点字段 Cache-Control(通用字段)
eg: Cache-Control: private, max-age=0, no-cache
首部字段 Cache-Control 能够控制缓存的行为,指令的参数是可选的,多个指令之间通过“,”分隔。首部字段 Cache-Control 的指令可用于请求及响应时。
缓存请求指令:
- max-age:指定相应的秒数(x秒),在首次请求完该资源后,x秒内重复请求该资源,则会直接从缓存(本地缓存或者共享缓存)中获取响应;(也可由响应端返回)
- s-maxage:功能与max-age相同,不同点是s-maxage只对共享缓存其作用。另外,当使用 s-maxage 指令后,则直接忽略对 Expires 首部字段及max-age 指令的处理;(也可由响应端返回)
- max-stale:可指示缓存资源,即使过期也照常接收。如果指令未指定参数值,那么无论经过多久,客户端都会接收响应;如果指令中指定了具体数值,那么即使过期,只要仍处于 max-stale指定的时间内,仍旧会被客户端接收;
- no-cache:不对过期的资源进行缓存,会向源服务器确认资源有效性再决定是否使用缓存(本地缓存或者共享缓存)。确认的方式:etag、if-none-match等;
- no-store:不进行缓存请求,一般用于保护一些机密信息。
缓存响应指令:
- private:表示它只应该存在本地缓存;
- public:表示它既可以存在共享缓存,也可以被存在本地缓存;
- no-cache:如果服务器返回的响应中包含 no-cache 指令,那么缓存服务器不能对资源进行缓存。源服务器以后也将不再对缓存服务器请求中提出的资源有效性进行确认,且禁止其对响应资源进行缓存操作。
- no-store:不进行缓存响应,一般用于保护一些机密信息;
- no-transform:使用 no-transform 指令规定无论是在请求还是响应中,缓存都不能改变实体主体的媒体类型。这样做可防止缓存或代理压缩图片等类似操作;
- proxy-revalidate:proxy-revalidate 指令要求所有的缓存服务器在接收到客户端带有该指令的请求返回响应之前,必须再次验证缓存的有效性;
验证缓存资源有效性的方式:
- tip:形如 If-xxx 这种样式的请求首部字段,都可称为条件请求。服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。
- If-Modify-Since/Last-Modify: 首部字段 If-Modified-Since,属附带条件之一,它会告知服务器若 If-Modified-Since 字段值早于资源的更新时间,则希望能处理该请求。而在指定 If-Modified-Since 字段值的日期时间之后,如果请求的资源 都没有过更新,则返回状态码 304 Not Modified 的响应。If-Modified-Since 用于确认代理或客户端拥有的本地资源的有效性。获取资源的更新日期时间,可通过确认首部字段 Last-Modified 来确定。
- If-Unmodified-Since: 与If-Modify-Since相反,若在指定的时间之前资源未发生修改,则使用缓存,否则发送请求;
- If-Match/Etag: 只有当 If-Match 的字段值跟 ETag 值匹配一致时,服务器才会接受请求;
- If-None-Match/Etag: 与If-Match的作用相反,用于指定 If-None-Match 字段值的实体标记(ETag)值与请求资源的 ETag 不一致时,它就告知服务器处理该请求。=>从而请求最新资源 =>与If-Modify-Since作用相似;
补充:
-
Cache-Control:no-cache http/1.1
-
Pragma:no-cache http/1.0 两者效果相同,用于解决http版本兼容性问题。
-
Expires:指定资源的过期时间,是一个绝对时间,当cache-control指定了max-age或者s-maxage时,该值会被覆盖。