前端知识笔记(三十六)———HTTP 缓存机制

一、强制缓存
只要浏览器判断缓存没有过期,则直接使用浏览器的本地缓存而无需再请求服务器。

强制缓存是利用下面这两个 HTTP 响应头部(Response Header)字段实现的,它们都用来表示资源在客户端缓存的有效期:

Cache-Control, 是一个相对时间;
Expires,是一个绝对时间;
如果 HTTP 响应头部同时有 Cache-Control 和 Expires 字段的话,Cache-Control 的优先级高于 Expires 。

Cache-control 选项更多一些,设置更加精细,所以建议使用 Cache-Control 来实现强制缓存。具体的实现流程如下:

当浏览器第一次请求访问服务器资源时,服务器会在返回这个资源的同时,在 Response 头部加上 Cache-Control,Cache-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 字段来使用,只有在未能命中强制缓存的时候,才能发起带有协商缓存字段的请求。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-13 01:52:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-13 01:52:02       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-13 01:52:02       82 阅读
  4. Python语言-面向对象

    2023-12-13 01:52:02       91 阅读

热门阅读

  1. 【代码随想录】算法训练计划49

    2023-12-13 01:52:02       67 阅读
  2. MySQL中查询当天数据中离时间点最近的数据

    2023-12-13 01:52:02       67 阅读
  3. Python卡尔曼滤波器OpenCV跟踪和预测物体的轨迹

    2023-12-13 01:52:02       60 阅读
  4. 3D点云:平面模型上提取凸(凹)多边形方法

    2023-12-13 01:52:02       49 阅读
  5. Codeforces Round 777 (Div. 2) (C D分类讨论 E倍增+贪心)

    2023-12-13 01:52:02       54 阅读
  6. 人工智能应用专栏----专栏介绍

    2023-12-13 01:52:02       57 阅读
  7. vue递归以及示例

    2023-12-13 01:52:02       54 阅读
  8. 第30期 | GPTSecurity周报

    2023-12-13 01:52:02       52 阅读
  9. 力扣labuladong——一刷day66

    2023-12-13 01:52:02       51 阅读
  10. SpringBoot 面试题和答案,最新面经

    2023-12-13 01:52:02       53 阅读
  11. 不容错过的计算机网络知识点解密!

    2023-12-13 01:52:02       48 阅读
  12. 从理论分析高可用

    2023-12-13 01:52:02       51 阅读
  13. 微信小程序如何跳转到网页

    2023-12-13 01:52:02       52 阅读
  14. 青蛙跳台阶(C语言)

    2023-12-13 01:52:02       56 阅读