一文带你了解 HTTP 黑科技( 五 )


这里需要注意一下 , 过期的资源并不会被回收或忽略 , 当高速缓存接收到过期资源时 , 它会使用 If-None-Match 转发此请求 , 以检查它是否仍然有效 。如果有效 , 服务器会返回 304 Not Modified响应头并且没有任何响应体 , 从而节省了一些带宽 。
下面是使用共享缓存代理的过程

一文带你了解 HTTP 黑科技

文章插图
 
这个图应该比较好理解 , 只说一下 Age 的作用 , Age 是 HTTP 响应标头告诉客户端源服务器在多久之前创建了响应 , 它的单位为秒 , Age 标头通常接近于0 , 如果是0则可能是从源服务器获取的 , 如果不是表示可能是由代理服务器创建 , 那么 Age 的值表示的是缓存后的响应再次发起认证到认证完成的时间值 。
缓存的有效性是由多个标头来共同决定的 , 而并非某一个标头来决定 。如果指定了 Cache-control:max-age=N  , 那么缓存会保存 N 秒 。如果这个通用标头不存在的话 , 则会检查是否存在 Expires 标头 。如果 Exprires 标头存在 , 那么它的值减去 Date 标头的值就可以确定其有效性 。最后 , 如果max-age 和 expires 都不存在 , 就去寻找 Last-Modified 标头 , 如果存在此标头 , 则高速缓存的有效性等于 Date 标头的值减去 Last-modified 标头的值除以10 。
缓存验证当到达缓存资源的有效期时 , 将对其进行验证或再次获取 。仅当服务器提供了强验证器或弱验证器时 , 才可以进行验证 。
当用户按下重新加载按钮时 , 将触发重新验证 。如果缓存的响应包含 Cache-control:must-revalidate标头 , 则在正常浏览下也会触发该事件 。另一个因素是 高级 -> 缓存首选项 面板中的缓存验证首选项 。有一个选项可在每次加载文档时强制进行验证 。
Etag我们上面提到了强验证器和弱验证器 , 实现验证器功能的标头正式 Etag 的作用 , 这意味着 HTTP 用户代理(例如浏览器)不知道该字符串表示什么 , 并且无法预测其值 。如果 Etag 标头是资源响应的一部分 , 则客户端可以在未来请求的标头中发出 If-None-Match , 以验证缓存的资源 。
Last-Modified响应标头可以用作弱验证器 , 因为它只有1秒可以分辨的时间 。如果响应中存在 Last-Modified标头 , 则客户端可以发出 If-Modified-Since请求标头来验证缓存资源 。(关于 Etag 更多我们会在条件请求介绍)
避免碰撞通过使用 Etag 和 If-Match 标头 , 你可以检测避免碰撞 。
例如 , 在编辑 MDN 时 , 将对当前 Wiki 内容进行哈希处理并将其放入响应中的 Etag 中
Etag: "33a64df551425fcc55e4d42a148795d9f25f89d4"当将更改保存到 Wiki 页面(发布数据)时 , POST 请求将包含 If-Match 标头 , 其中包含 Etag 值以检查有效性 。
If-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"如果哈希值不匹配 , 则表示文档已在中间进行了编辑 , 并返回 412 Precondition Failed 错误 。
缓存未占用资源Etag 标头的另一个典型用法是缓存未更改的资源 , 如果用户再次访问给定的 URL(已设置Etag) , 并且该 URL过时 , 则客户端将在 If-None-Match 标头字段中发送其 Etag 的值
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"服务器将客户端的 Etag(通过 If-None-Match 发送)与 Etag 进行比较 , 以获取其当前资源版本 , 如果两个值都匹配(即资源未更改) , 则服务器会发回 304 Not Modified状态 , 没有主体 , 它告诉客户端响应的缓存仍然可以使用 。
HTTP CROS 跨域CROS 的全称是 Cross-Origin Resource Sharing(CROS) , 中文译为 跨域资源共享 , 它是一种机制 。是一种什么机制呢?它是一种让运行在一个域(origin)上的 Web 应用被准许访问来自不同源服务器上指定资源的机制 。在搞懂这个机制前 , 你需要线了解什么是 域(origin)
OriginWeb 概念中域(Origin) 的内容由scheme(protocol) - 协议 , host(domain) - 主机和用于访问它的 URL port - 端口定义 。仅仅当 scheme 、host、port 都匹配时 , 两个对象才有相同的来源 。这种协议相同 , 域名相同 , 端口相同的安全策略也被称为 同源策略(Same Origin Policy) 。某些操作仅限于具有相同来源的内容 , 可以使用 CORS 取消此限制 。


推荐阅读