You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
该字段是http1.0时的规范,它的值为一个绝对时间的GMT格式的时间字符串,比如Expires:Mon,18 Oct 2066 23:59:59 GMT。这个时间代表着这个资源的失效时间,在此时间之前,即命中缓存。这种方式有一个明显的缺点,由于失效时间是一个绝对时间,所以当服务器与客户端时间偏差较大时,就会导致缓存混乱。
浏览器缓存的优点
浏览器使用缓存的机制
header
信息,根据其中的expires
和cache-control
判断是否命中强缓存),若命中则直接从缓存中获取资源,包括缓存的header
信息,本次请求不会与服务器进行通信;header
字段信息(Last-Modified/IF-Modified-Since
、Etag/IF-None-Match
),由服务器根据请求中的相关header
信息来对比结果是否命中协商缓存,若命中,则服务器返回新的响应header
信息更新缓存中的对应header
信息,但是并不返回资源内容,它会告知浏览器可以直接从缓存获取;否则返回最新的资源内容。强缓存
强缓存是利用http的返回头中的Expires或者Cache-Control两个字段来控制的,用来表示资源的缓存时间。
Expires
该字段是http1.0时的规范,它的值为一个绝对时间的GMT格式的时间字符串,比如
Expires:Mon,18 Oct 2066 23:59:59 GMT
。这个时间代表着这个资源的失效时间,在此时间之前,即命中缓存。这种方式有一个明显的缺点,由于失效时间是一个绝对时间,所以当服务器与客户端时间偏差较大时,就会导致缓存混乱。Cache-Control
Cache-Control
是http1.1时出现的header
信息,主要是利用该字段的max-age
值来进行判断,它是一个相对时间,例如Cache-Control:max-age=3600
,代表着资源的有效期是3600秒。cache-control
除了该字段外,还有下面几个比较常用的设置值:ETag
,那么请求的时候会与服务端验证,如果资源未被更改,则可以避免重新下载。Cache-Control
与Expires
可以在服务端配置同时启用,同时启用的时候Cache-Control
优先级高。协商缓存
协商缓存就是由服务器来确定缓存资源是否可用,所以客户端与服务器端要通过某种标识来进行通信,从而让服务器判断请求资源是否可以缓存访问,这主要涉及到下面两组header字段,这两组搭档都是成对出现的,即第一次请求的响应头带上某个字段(
Last-Modified
或者Etag
),则后续请求则会带上对应的请求字段(If-Modified-Since
或者If-None-Match
),若响应头没有Last-Modified
或者Etag
字段,则请求头也不会有对应的字段。Last-Modify/If-Modify-Since
浏览器第一次请求一个资源的时候,服务器返回的
header
中会加上Last-Modified
,Last-Modified
是一个时间,标识该资源的最后修改时间,例如Last-Modified: Thu,31 Dec 2037 23:59:59 GMT
。当浏览器再次请求该资源时,request的请求头中会包含
If-Modified-Since
,该值为缓存之前返回的Last-Modified
。服务器收到If-Modified-Since
后,根据资源的最后修改时间判断是否命中缓存。如果命中缓存,则返回
304
,并且不会返回资源内容,并且不会返回Last-Modified
。ETag/If-None-Match
与
Last-Modified/If-Modified-Since
不同的是,Etag/If-None-Match
返回的是一个校验码。ETag
可以保证每一个资源是唯一的,资源变化都会导致ETag
变化。服务器根据浏览器发送的If-None-Match
值来判断是否命中缓存。与
Last-Modified
不一样的是,当服务器返回304 Not Modified
的响应时,由于ETag
重新生成过,response header
中还会把这个ETag
返回,即使这个ETag
跟之前的没有变化。The text was updated successfully, but these errors were encountered: