北京朝阳网站建设公司,网站设计说明书摘要,wordpress发微信公众号,微信公众号好看的模板哪里找一、强制缓存
只要浏览器判断缓存没有过期#xff0c;则直接使用浏览器的本地缓存而无需再请求服务器。
强制缓存是利用下面这两个 HTTP 响应头部#xff08;Response Header#xff09;字段实现的#xff0c;它们都用来表示资源在客户端缓存的有效期#xff1a;
Cache…一、强制缓存
只要浏览器判断缓存没有过期则直接使用浏览器的本地缓存而无需再请求服务器。
强制缓存是利用下面这两个 HTTP 响应头部Response Header字段实现的它们都用来表示资源在客户端缓存的有效期
Cache-Control 是一个相对时间Expires是一个绝对时间
如果 HTTP 响应头部同时有 Cache-Control 和 Expires 字段的话Cache-Control 的优先级高于 Expires 。
Cache-control 选项更多一些设置更加精细所以建议使用 Cache-Control 来实现强制缓存。具体的实现流程如下
当浏览器第一次请求访问服务器资源时服务器会在返回这个资源的同时在 Response 头部加上 Cache-ControlCache-Control 中设置了过期时间大小浏览器再次请求访问服务器中的该资源时会先通过请求资源的时间与 Cache-Control 中设置的过期时间大小来计算出该资源是否过期如果没有则使用该缓存否则重新请求服务器服务器再次收到请求后会再次更新 Response 头部的 Cache-Control。 二、协商缓存
与服务端协商之后通过协商结果来判断是否使用本地缓存。 协商缓存可以基于两种头部来实现。
第一种请求头部中的 If-Modified-Since 字段与响应头部中的Last-Modified字段 (基于时间实现)
响应头部中的 Last-Modified标示这个响应资源的最后修改时间请求头部中的 If-Modified-Since当资源过期了发现响应头中具有 Last-Modified 声明则再次发起请求的时候带上 Last-Modified 的时间服务器收到请求后发现有 If-Modified-Since 则与被请求资源的最后修改时间进行对比Last-Modified。如果最后修改时间较早说明资源又被改过则返回最新资源HTTP 200 OK如果最后修改时间较小说明资源无新修改响应 HTTP 304 走缓存。
第二种请求头部中的 If-None-Match 字段与响应头部中的 ETag 字段 (基于一个唯一标识实现能更准确地判断文件内容是否被修改)
响应头部中ETag唯一标识响应资源请求头部中的 If-None-Match当资源过期时浏览器发现响应头里有 Etag则再次向服务器发起请求时会将请求头 If-None-Match 值设置为 Etag 的值。服务器收到请求后进行比对如果资源没有变化返回 304如果资源变化了返回 200。 如果在第一次请求资源的时候服务端返回的 HTTP 响应头部同时有 Etag 和 Last-Modified 字段那么客户端再下一次请求的时候如果带上了 ETag 和 Last-Modified 字段信息给服务端这时 Etag 的优先级更高也就是服务端先会判断 Etag 是否变化了如果 Etag 有变化就不用在判断 Last-Modified 了如果 Etag 没有变化然后再看 Last-Modified。
为什么 ETag 的优先级更高
这是因为 ETag 主要能解决 Last-Modified 几个比较难以解决的问题
在没有修改文件内容情况下文件的最后修改时间可能也会改变这会导致客户端认为这文件被改动了从而重新请求可能有些文件是在秒级以内修改的If-Modified-Since 能检查到的粒度是秒级的使用 Etag就能够保证这种需求下客户端在 1 秒内能刷新多次有些服务器不能精确获取文件的最后修改时间。
注意协商缓存这两个字段都需要配合强制缓存中 Cache-Control 字段来使用只有在未能命中强制缓存的时候才能发起带有协商缓存字段的请求。