当前位置: 首页 > Web前端 > HTML

304状态码详解(协商缓存)

时间:2023-03-28 17:15:22 HTML

304状态码详解(协商缓存)上一篇文章整理了不同的状态码,也提到要专门针对304做详细的解释,所以有了,今晚前来学习。先说说背景:我们知道前端代码打包后,需要部署到静态服务器上。客户端输入url就可以看到对应的页面。从客户端向服务器发送请求以接收资源需要建立连接并消耗带宽。但是静态资源的变化频率往往没有那么高,所以有一些特殊的响应头设置。通过这些设置,浏览器可以直接从本地硬盘或内存中获取资源文件,而无需发送请求。这样也减轻了服务器的负担,也加快了客户端网页的加载速度,用户体验不错。设置方法:1.通过expires(http1的规范,目前是向下兼容的,所以有些网站还在用这个):它的值是一个绝对时间的GMT时间字符串。2.Cache-control字段:该字段有几个可选值,包括no-cache、no-store、public、private等,这些值决定了是否可以使用缓存以及缓存的方式。当使用no-cache时,表示不使用本地缓存,客户端会向服务端发送请求,由服务端决定是否再次获取资源。no-store时,资源将被完全下载。public时:表示该资源可以被所有用户缓存,包括serverprivate时,表示该资源只能被浏览器端缓存。如果两者同时存在,则cache-control具有更高的优先级。当我们发送请求让浏览器判断时,客户端和服务端需要一些标识来进行通信,比如If-Modified-Since和If-None-Match字段。这两个字段的值在第一次请求的响应头中传递。最后修改,etag结转。示例//响应headeretag:'5c20abbd-e2e8'last-modified:Mon,24Dec201809:49:49GMT//请求标头变为if-none-matched:'5c20abbd-e2e8'if-modified-since:Mon,24Dec201809:49:49GMT当浏览器没有命中强缓存而使用协商缓存时,它会将这些值与资源文件中的信息进行比较。如果资源没有变化,返回304,浏览器读取本地缓存。如果资源发生变化,则返回200,返回最新的资源。至于为什么会有etag和last-modified两个字段,主要是为了解决服务端事件不准确的问题,增加了etag。这两个判断相辅相成。具体如何做出决定取决于服务器如何处理它。