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

「MISC」HTTP缓存控制

时间:2023-04-02 11:21:04 HTML

现在的web应用越来越复杂,体验也越来越好。相应的,资源文件也越来越大。如果客户端不用更新资源就可以直接访问缓存的数据,那么不仅资源加载速度会更快,服务器压力也会更小,同时也为绿色地球做出了贡献。做出了贡献。程序员一直在追求最好。在尝试缓存静态资源之后,大家找到了一些缓存动态生成内容的方法。看来程序员都是环保主义者(笑。从HTTP/1.0-HTTP/1.1开始,控制缓存的方法有3种:Expires(响应头,HTTP/1.0)Cache-Control(响应头,HTTP/1.1)——最后——Modified(响应头)、If-Modified-Since(请求头)-Etag(响应头)、If-None-Match(请求头)上面就是HTTP控制缓存的方法,除了这些,在第二个还有有If-Unmodified-Since,第三个也有If-Match。但这两个响应头不是做缓存控制的,而是确认修改资源的一致性的。后面会介绍。HTTP/1.0ExpiresExpires:的格式如下:Date:,::GMTExample:Fri,03Nov201703:22:39GMT当设置Expires时,客户端不会在这个日期之前请求服务器,而是直接从缓存中获取。但是也有一个问题:如果你根本不请求服务器,资源过期了如果之前更新过资源,客户端还是使用之前的资源。于是产生了下面更高级的缓存控制方法(第三种和第四种方法)。但是还有一种方法可以解决这个问题:设置资源的Expires设置足够长的时间,资源名称就是资源的Hash值,这样资源更新后,也使用不同的名称.那么上面就没有问题了。HTTP/1.1Cache-ControlExpires只能设置特定的情况,如果客户端和服务端的时间不一致,就会导致缓存时间不正确,可能直接导致缓存失败。HTTP/1.1的Cache-ControlwithIf-Modified-Since或If-None-Match完美解决了这个问题。Cache-Control常用的指令如下:cacheabilitypublic:响应可以任意缓存private:响应只能被客户端缓存,不能被中间节点(proxy、CDN等)缓存no-cache:中间节点必须发送来验证缓存有效性。如果是原服务器,自己确认only-if-cached:中间节点直接使用已有的缓存确认有效性,不向原服务器确认。如果是原来的服务器,该命令无效。Expirationcontrolmax-age=:指定相对于请求时间的过期时间,单位为秒。Re-validationmust-revalidation:缓存过期后,必须向服务器确认缓存是否有效。Otherno-store:忽略缓存的存在,直接向服务器请求最新的资源。确认缓存对上面列表中的服务器是否有效的技术手段是下面介绍的Last-Modified/If-Modified-Since和ETag/If-None-Match。Last-Modified/If-Modified-SinceLast-Modified:Last-Modified头是服务器告诉客户端这个资源的最后修改时间,客户端会存储这个资源和这个时间。之后根据Cache-Control的指示,如果需要和服务器确认资源的合法性,就会把这个时间放到If-Modified-Since头中,让服务器进行比较,返回304或者200。If-Modified-Since标头只会附加到GET和HEAD请求中的请求标头。If-Unmodified-SinceIf-Unmodified-Since:一般用在PUT、POST等方法中,表示本次请求更新资源的日期为,如果服务器检测到日期现有资源的如果不是(即已经被其他方法更新过),会失败,返回412。ETag/If-None-MatchETag:W/""ETag:""If-None-Match:""[,""...]If-None-Match:W/""[,""]如果把上面的Last-Modified/If-Modified-Since应用于动态数据,基本是行不通的。那么这样就有缓存了。在第一次请求时,服务器将附加ETag标头。ETag的值是根据响应的内容生成的,一般来说就是内容的哈希值(+一些其他的标识)。之后根据Cache-Control指令,如果需要和服务器确认资源的合法性,会将etag_value放在If-None-Match头中,供服务器比较,是返回304还是返回200.如果ETag值前面有W/,说明这是一个弱Etag。弱ETag相等意味着两个内容在语义上相等,强ETag相等意味着内容的每个字节都相等。举一个弱ETag的例子:返回的数据中包含日志信息,但是两次返回的数据是一样的,只是日志不同。还有一个语法:If-None-Match:*,基本用在PUT、POST等上传上。表示请求上传的文件在服务器上不存在。If-MatchIf-Match:""[,""...]If-Match:W/""[,""]对于GET、HEAD等请求,如果该资源如果ETag与If-Match值匹配,则返回该资源,否则返回412。对于PUT、POST等请求,如果已有资源的Etag与If-Match的值匹配,则执行写操作,否则失败返回412。-----记得点赞-----

猜你喜欢