网站开发长期合作,dw网站设计与制作,开题报告风景区网站开发,做外贸是不是要有网站文章目录 HTTP缓存强缓存协商缓存状态码区别缓存优先级如何设置强缓存和协商缓存使用场景 HTTP缓存
HTTP缓存时利用HTTP响应头将所请求的资源在浏览器进行缓存#xff0c;缓存方式分两种#xff1a;强缓存和协商缓存。 浏览器缓存是指将之前请求过的资源在浏览器进行缓存缓存方式分两种强缓存和协商缓存。 浏览器缓存是指将之前请求过的资源在浏览器进行缓存以便在下一次访问时重复使用从而节省带宽、提升访问速度、降低服务器压力。
浏览器在第一次请求发生后再次请求时 浏览器会先获取该资源缓存的header信息根据其中的expires和cahe-control判断是否命中强缓存若命中则直接从缓存中获取资源包括缓存的header信息本次请求不会与服务器进行通信 如果没有命中强缓存浏览器会发送请求到服务器该请求会携带第一次请求返回的有关缓存的header字段信息Last-Modified / IF-Modified-Since、Etag / IF-None-Match由服务器根据请求中的相关header信息来对比结果是否命中协商缓存若命中则服务器返回新的响应header信息更新缓存中的对应header信息但是并不返回资源内容它会告知浏览器可以直接从缓存获取否则返回最新的资源内容。
强缓存
强缓存指的是在缓存时间内不会向服务器发起请求只有过期之后才会向服务器发起请求。 HTTP1.0规范 Expires字段表示资源的过期时间。在浏览器第一次请求资源时服务器端的响应头会附上Expires这个响应字段当浏览器在下一次请求这个资源时会根据上次的Expires字段是否使用缓存资源当请求时间小于服务端返回的到期时间直接使用缓存数据 比如Expires:Mon,18 Oct 2066 23:59:59 GMT。这个时间代表着这个资源的失效时间在此时间之前即命中缓存。这种方式有一个明显的缺点由于失效时间是一个绝对时间所以当服务器与客户端时间偏差较大时就会导致缓存混乱。
HTTP1.1规范 Expires有个缺点当客户端本地时间被修改时浏览器会直接向服务器请求新的资源为了解决这个问题在http1.1规范中提出了cache-control字段且这个字段优先级高于上面提到的Expires值是相对时间。 主要是利用该字段的max-age值来进行判断它是一个相对时间例如Cache-Control:max-age3600代表着资源的有效期是3600秒。 Cache-Control与Expires可以在服务端配置同时启用同时启用的时候Cache-Control优先级高。 cache-control除了max-age外还有下面几个比较常用的设置值
no-cache需要使用协商缓存来验证缓存数据数据储存在本地缓存区中只是在与原始服务器进行新鲜度再验证之前缓存不能将其提供给客户端使用。需要使用缓存协商先与服务器确认返回的响应是否被更改如果之前的响应中存在ETag那么请求的时候会与服务端验证。no-store直接禁止浏览器缓存数据每次都会下载完整的资源。public可以被所有的用户缓存包括终端用户和CDN等中间代理服务器。private只能被终端用户的浏览器缓存不允许CDN等中继缓存服务器对其缓存。
协商缓存
协商缓存主要依赖的响应头包括Last-Modified和ETag需要和服务器交互请求资源命中协商缓存后返回的状态码为 304所以304状态码不应该认为是一种错误而是对客户端有缓存情况下服务端的一种响应。
Last-Modified记录资源最后修改的时间。 ETag基于资源的内容编码生成一串唯一的Hash值, 只要内容不同, 就会生成不同的ETag。
Last-Modified有以下两个缺点 1 只要编辑了不管内容是否真的有改变都会以这最后修改的时间作为判断依据当成新资源返回从而导致了没必要的请求相应而这正是缓存本来的作用即避免没必要的请求。 2 时间的精确度只能到秒如果在一秒内的修改是检测不到更新的仍会告知浏览器使用旧的缓存。
内容发生变化都会生成新的当生成etag的资源过大时更新比较频繁会造成开销所以二者要根据资源的特性合理选择那种模式。
状态码区别
200 请求成功服务器返回全新数据。 200 from memory cache / from disk cache 本地强缓存还在有效期直接使用本地缓存 from memory cache 是页面刷新的时候内存取的。from disk cache 页面标签关闭后从磁盘取的 304 请求成功走了协商缓存服务器判定Etag和Last-modified没有过期告知浏览器使用缓存
缓存优先级
expires和cache-control如果同时存在时cache-control会覆盖expiresexpires无效无论是否过期即 Cache-control expires 强缓存和协商缓存如果同时存在时会去先对比强缓存是否还再有效期如果强缓存生效则对比协商缓存即强缓存 协商缓存 协商缓存Etag和last-modified同时存在时会先比较Etaglast-modified无效即Etag last-modified 如何设置强缓存和协商缓存
1、后端服务器设置
如nodejs:
res.setHeader(max-age: 3600 public)
res.setHeader(etag: 5c20abbd-e2e8)
res.setHeader(last-modified: Mon, 24 Dec 2018 09:49:49 GMT)2、nginx配置
使用场景
1.频繁变动的资源 协商缓存 Cache-Control: no-cache 对于频繁变动的资源让他走协商缓存no-cache是不缓存过期的资源全都走协商缓存虽然不能减少请求的发送次数但是优点就是减少响应数据的返回大小
2.不常变化的资源 强缓存 Cache-Control: max-age31536000 对于很少变化的资源直接设置它强缓存的时间长远一点能够减少请求的发送次数比如说像一些库类jquery-js的库等还有一些logo图片等
参考 https://blog.csdn.net/sunyctf/article/details/129865320 https://www.51cto.com/article/676318.html https://blog.csdn.net/weixin_59613114/article/details/129717896 https://www.jianshu.com/p/9c95db596df5/ https://blog.csdn.net/JarryNeverGiveup/article/details/131060939 https://blog.csdn.net/m0_59070120/article/details/126976646