这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战
哪个header设置是强缓存
A:if-Modified-Since
B:Etag
C:Last-Modified
D:Expiress
这四个标签都是HTTP的请求头部标签
HTTP进行请求时会发送一个请求报文,一个请求报文由请求行(request line)、请求头部(headers)、空行(blank line)和请求数据(request body)4个部分组成。
其中请求头部为请求报文添加了一些附加信息,由关键字/值对组成,每行一对,关键字和值用冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息。
该标签在浏览器第一次请求发生以后,再次请求时被获取,也就是从请求信息的缓存中获取;
此时浏览器会优先获取该资源的header信息,从而判断该如何缓存资源,缓存资源有两种方式,一种是强缓存,一种是协商缓存,这都要根据响应的header内容来决定。
这两种缓存的区别在于,强缓存是服务器直接通过设置http中header的Expires和cache-control字段告诉浏览器缓存的有效期,而协商缓存就是由服务器来判断该缓存是否可用。
致此我们可以,很容易的判断出这道题的答案为D。
强缓存
Expires: 是http1.0的规范,它的值是一个绝对时间的GMT格式的时间字符串。
这个值代表这份资源的失效时间,只要客户端发送请求的时间是在这个值之前,那么本地的缓存、权限等内容始终有效。用这个字段处理缓存权限有一个缺点,有序失效的时间是一个GMT的绝对时间。所以当客户端与服务器时间偏差较大时,会导致缓存混乱,在某些浏览器中会从访问网站开始阻止用户的请求。
cache-control: 是http1.1中出现的一个字段,一般利用该字段的max-age设置值来判断失效时间。例如
Cache-Control:max-age=3600
在使用该字段时,除了max-age还有几个可选值:
no-cache:告知服务器不直接使用缓存,要求向源服务器发起请求
no-store:所有内容都不会被保存到缓存或Internet临时文件中
max-stale:告知服务器客户端愿意接收一个超过缓存时间的资源。
min-fresh=delta-seconds:告知服务器客户端希望接受一个在小于delta-seconds秒内被更新过的资源
no-transfrom:告知服务器客户端希望获取缓存的内容,而不用向源服务器发去请求
cache-extension:自定义扩展值,若服务器不识别该值将被忽略掉
协商缓存
协商缓存主要涉及到两组header字段
Etag与If-None-Match
Last-Modified与If-Modified-Since
这两组字段都是成对出现的,即第一次请求的响应头如果带上Etag或Last-Modified,那么后续请求就会对应带上If-None-Match或If-Modified-Since。若头次请求响应头没有Etag或Last-Modified,则请求头也不会有对应的字段
Last-Modified与If-Modified-Since: 在浏览器第一次请求某一个URL时,如果请求顺利,服务器端将会返回一个200状态,同时会返回你请求的资源,在这个资源文件中,有一个Last-Modified会标记此文件在服务器端最后被修改的时间。
客户端第二次请求此URL时,根据HTTP的规定,浏览器会向服务器传送If-Modified-Since,询问该修改时间有没有变化,在浏览器得到的修改时间之后,这份文件在服务器端是否被修改过如果服务器端的资源被修改果,将会重新发出资源,重新携带上最新的Last-Modified,重复这部分操作。如果服务器端的信息没有被修改,则返回状态码304,表示一切正常,这样可以大大的节省数据的传输量,达到浏览器缓存的目的。
Etag与If-None-Match: Etag是HTTP1.1中的一个属性,由服务器生成并返回给前端
当你第一次发起请求时,服务器会在返回报文中带一个Etag标签。在客户端第二次发起同一个请求时,客户端会给服务器发送一个If-None-Match字段,该字段与第一次请求的Etag值相同。
之后,服务器端会把这份客户端的字段与自己最新的字段做比对,如果相同,就讲If-None-Match的值设为false,返回状态码304.客户端接收到304的状态码后,将改变战略使用本地缓存,不解析服务器返回的数据,此时也就达成了浏览器缓存的目的。如果不相同,就将If-None-Match的值设为true,返回状态200,客户端重新解析服务器返回的数据并放置到页面上。
相较来说,Etag会比Last-Modified更为进准,因为Last-Modified标注的修后修改只能精准到秒级,如果某些文件在1秒钟以内,被修改多次,它将不能准确标注文件的修改时间。