http之强制缓存和协商缓存

缓存

浏览器缓存(Brower Caching)是浏览器对之前请求过的文件进行缓存,以便下一次访问时重复使用,节省带宽,提高访问速度,降低服务器压力。

区别

缓存的机制主要在http响应头设定。

缓存有4个头字段,分别是Expires、Cache-Control、Last-Modified、Etag。

两类缓存规则可以同时存在,强制缓存优先级高于协商缓存。

也就是说,当执行强制缓存的规则时,如果缓存生效,直接使用缓存(我就是这么霸道),不再执行协商缓存规则。

一张图看懂他们表面的区别。

强制缓存

强制~强制,不用沟通,不用经过谁谁的同意,我想怎样就怎样。

强制缓存就是这样,浏览器不会请求服务器,直接从本地缓存中读取文件并返回200。

它在header有2个头字段,Expires和Cache-Control。

Expires

过期的时间,在此设置时间内,直接读取缓存文件,是http1.0的头字段

Cache-Control

是http1.1的头字段,有以下6个属性。

max-age:用来设置资源(representations)可以被缓存多长时间,单位为秒;

s-maxage:和max-age是一样的,不过它只针对代理服务器缓存而言;

public:指示响应可被任何缓存区缓存;

private:只能针对个人用户,而不能被代理服务器缓存;

no-cache:强制客户端直接向服务器发送请求,也就是说每次请求都必须向服务器发送。服务器接收到 请求,然后判断资源是否变更,是则返回新内容,否则返回304,未变更。这个很容易让人产生误解,使人误 以为是响应不被缓存。实际上Cache-Control: no-cache是会被缓存的,只不过每次在向客户端(浏览器)提供响应数据时,缓存都要向服务器评估缓存响应的有效性。

no-store:禁止一切缓存(这个才是响应不被缓存的意思)。

协商缓存

协商~协商,有商有量的,要征得你的同意。

它在header有2个头字段,Last-Modified和Etag。

Last-Modified/If-Modified-Since

是http1.0的头字段

Last-Modified: 服务器上文件的最后修改时间,在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记此文件在服务期端最后被修改的时间。

If-Modified-Since:浏览器第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送 If-Modified-Since 报头,询问该时间之后文件是否有被修改过。

Etag/If-None-Match

Etag:由服务器生成Hash返回给前端,用来帮助服务器控制浏览器的缓存验证。

If-None-Match:当资源过期时,浏览器发现响应头里有Etag,则再次向服务器请求时带上请求头if-none-match(值是Etag的值)。服务器收到请求进行比对,有变化返回200/没有变化返回304

posted @ 2025-02-17 17:10  牛肉夹馍夹心饼干  阅读(34)  评论(0)    收藏  举报