最强Http缓存策略之强缓存和协商缓存的详解与应用实例

2023-11-11

HTTP缓存是指浏览器或者代理服务器将已经请求过的资源保存到本地,以便下次请求时能够直接从缓存中获取资源,从而减少网络请求次数,提高网页的加载速度和用户体验。缓存分为强缓存和协商缓存两种模式。

一. 强缓存

强缓存是指浏览器直接从本地缓存中获取资源,而不需要向web服务器发出网络请求。这是因为浏览器在第一次请求资源时,服务器会在响应头中添加相关缓存的响应头,以表明该资源的缓存策略。
常见的强缓存响应头如下所述:

  1. Cache-Control
    Cache-Control 响应头是用于控制强制缓存和协商缓存的缓存策略。该响应头中的指令如下:
  • max-age:指定该资源在本地缓存的最长有效时间,以秒为单位。例如:Cache-Control: max-age=31536000(代表该资源在本地缓存中一年内有效)。
  • no-cache:代表该资源需要进行缓存,但是在使用前需要向服务器发送请求,以此让服务器根据 If-Modified-Since 或 If-None-Match 判断该资源是否更新,以此决定是否使用本地缓存。
  • no-store:代表禁止使用任何形式的缓存,每次请求都需要重新向服务器发送请求。
    例如,下面是一个 Cache-Control 响应头的示例:
    Cache-Control: public, max-age=31536000
    其中,public 表示该资源在客户端和代理服务器中均可以缓存,max-age=31536000 表示该资源在本地缓存中一年内有效。
  1. Expires
    Expires 响应头在 HTTP / 1.0 中被广泛使用,用于指定资源的到期时间,以确保浏览器不会在过期日期之后再次发送请求。
    例如,下面是一个 Expires 响应头的示例:
    Expires: Tue, 30 Dec 2030 12:00:00 GMT
    其中,Expires 表示该资源的到期时间为 Tue, 30 Dec 2030 12:00:00 GMT。

二. 协商缓存

协商缓存是指在使用缓存之前,浏览器需要向服务器发起网络请求,以此根据服务器返回的响应头中的 ETag 或 Last-Modified 字段来判断该资源是否更新,进而决定是否使用本地缓存。
常见的协商缓存响应头如下所述:

  1. ETag
    ETag 是一个 Web 服务器为每个资源分配的唯一标识符,用于判断该资源是否更新。例如,下面是一个 ETag 响应头的示例:
    ETag: “123456789”
    其中,“123456789” 是该资源的唯一标识符。
  2. Last-Modified
    Last-Modified 是资源在服务器上最后被修改的时间戳,也用于协商缓存。例如,下面是一个 Last-Modified 响应头的示例:
    Last-Modified: Fri, 01 Jan 2021 00:00:00 GMT
    在协商缓存中,浏览器请求服务器时,会在请求头中添加 If-None-Match(代表当前本地缓存中资源的 ETag 值)和 If-Modified-Since(代表当前本地缓存中资源的 Last-Modified 时间戳)字段,告诉服务器自己本地缓存的该资源的 ETag 和 Last-Modified 时间戳。服务器收到请求后,会根据请求头中的这些字段和资源的当前 ETag 和 Last-Modified 时间戳,来判断该资源是否更新。
    如果资源未更新,则服务器返回 304 Not Modified 响应码,表示不需要重新下载资源,可以直接使用本地缓存。如果资源已更新,则服务器返回新的资源,并更新浏览器的本地缓存。

三. 示例

下面通过一个实际的案例来展示 HTTP 缓存的具体应用。假设有一个服务器上的图片资源,其地址为 https://example.com/img/logo.png,其相关信息如下:

  • 大小:10KB
  • 修改时间:2021/05/20 10:10:10
  • ETag:“123456”
  • 缓存策略:Cache-Control: max-age=3600
    当浏览器首次发起请求时,服务器会将响应头中的 Cache-Control 和 ETag 值返回给浏览器,如下所示:
HTTP/1.1 200 OK
Cache-Control: max-age=3600
ETag: "123456"
Content-Length: 10240
Content-Type: image/png
 <binary image data...>

浏览器接收到响应头中的相关信息后,将资源保存到本地缓存中。当浏览器再次请求这个资源时,浏览器会先检查本地缓存中是否有该资源的缓存条目,如果有,则会直接返回本地缓存中的数据;如果没有,则会向服务器发起请求。
浏览器在发起请求时,会将 If-None-Match 和 If-Modified-Since 字段添加到请求头中,告诉服务器自己本地缓存的该资源的 ETag 和 Last-Modified 时间戳,如下所示:

GET /img/logo.png HTTP/1.1
Host: example.com
If-None-Match: "123456"
If-Modified-Since: Thu, 20 May 2021 10:10:10 GMT

服务器接收到请求后,会根据请求头中的 If-None-Match 和 If-Modified-Since 字段和资源的当前 ETag 和 Last-Modified 时间戳,来判断该资源是否更新。如果资源未更新,则服务器返回 304 Not Modified 响应码,表示不需要重新下载资源,可以直接使用本地缓存。如果资源已更新,则服务器返回新的资源,并更新浏览器的本地缓存。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最强Http缓存策略之强缓存和协商缓存的详解与应用实例 的相关文章

  • gRPC(HTTP/2) 比使用 HTTP/2 的 REST 更快吗?

    目标是引入一种性能更好的传输和应用层协议latency and 网络吞吐量 目前 该应用程序使用REST with HTTP 1 1并且我们遇到了很高的延迟 我需要解决这个延迟问题并且我愿意使用gRPC HTTP 2 or 休息 HTTP2
  • AWS ALB 截断 HTTP 响应

    我有一个带有目标组的 ALB 和运行 PHP API 的 ECS 集群 我正在尝试查询 API 以获得 CSV 响应 但如果请求通过 ALB 我会得到被截断的结果 当我通过 SSH 连接到运行集群的 EC2 实例并尝试手动运行curl 通过
  • 是否可以在ajax get请求中获取页面的一部分?

    我知道我们可以在向服务器发出 GET 请求时获取整个页面 但是如果我只对该页面上的一个特定 div 感兴趣 或者更准确地说对其内容感兴趣 该怎么办 这里唯一的选择是获取整个页面 例如使用 jquery find 从中获取 div 内容吗 或
  • C# - 如何进行 HTTP 调用

    我想对网站进行 HTTP 调用 我只需要点击 URL 不想上传或下载任何数据 最简单 最快的方法是什么 我尝试了下面的代码 但它很慢 并且在第二次重复请求后 它只是超时 59 秒 然后恢复 WebRequest webRequest Web
  • 为什么使用 HTTP 动词?

    因为动词的目标是像 server domain getallrecords 或 server domain delete1record 或类似的 URL 而getallrecords delete1record都是专门为特定目的而设计的 为
  • POST 后使用 303 重定向以避免“网页已过期”:如果字节数超过 GET 请求可以处理的字节数,它会工作吗?

    我想解决 网页已过期 问题 首先 我刚刚将 POST 更改为 GET 但这导致出现错误 我的 HTTP 请求超出了 GET 的最大大小 所以 现在我想尝试下面链接中描述的技术 帖子 303 重定向 但是我仍然会遇到相同的大小限制问题吗 对
  • 在读取正文之前拒绝 HTTP 请求

    我正在开发一个网站 用户需要上传一些非常大的文件 该网站是用 PHP 编写的 在某些情况下 我想根据标头拒绝文件 理想情况下 我想在收到标头后立即拒绝请求 而不读取正文 如果标头足以表明该文件应被拒绝 则没有理由读取 200M 的文件 此外
  • 面向服务的架构 - AMQP 或 HTTP

    一点背景 非常大的整体 Django 应用程序 所有组件都使用相同的数据库 我们需要分离服务 以便我们可以独立升级系统的某些部分而不影响其余部分 我们使用 RabbitMQ 作为 Celery 的代理 现在我们有两个选择 使用 REST 接
  • 404 标头 - HTTP 1.0 还是 1.1?

    为什么我能找到的几乎每个例子 包括这个问题 https stackoverflow com questions 437256 sending a 404 error in php大约一年前 说 404 标头应该是HTTP 1 0 404 N
  • 如何在flutter项目中使用http拦截器?

    我必须向我的所有 Api 添加标头 有人告诉我为此使用 http 拦截器 但我无法理解如何做到这一点 因为我是颤振的新手 谁能帮我举个例子吗 您可以使用http 拦截器 https pub dev packages http interce
  • JS 库请求的常见 HTTP 标头是什么?

    使用JavaScript 框架原型 http www prototypejs org 我注意到 Ajax 请求通过一个名为X Requested With 其他 JavaScript 库 如 jQuery dojo 和 YUI 是否会向其
  • UNIX/MacOS 上静态文件的“临时 Web 服务器”?

    是否有一个像小型网络服务器这样的东西 我可以从命令行调用它 只从本地文件系统获取文件并通过特定端口上的 HTTP 为它们提供服务 我希望能够做这样的事情 cd Sites mysite serve 10 0 1 1 8080 这应该会启动一
  • 从手机访问本地主机[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在使用
  • 使用 WCF 支持“application/x-www-form-urlencoded”发布数据的最佳方式?

    我正在基于 W3C 规范构建 WCF 服务 该规范定义了接受 application x www form urlencoded 发布数据的 RESTful Web 服务端点 默认情况下 WCF 不支持这种类型的消息编码 我发现了许多创建如
  • put方法中的Angularjs文件上传不起作用

    我有一个简单的待办事项应用程序 我试图在其中上传照片和单个待办事项 现在我已经创建了这个工厂函数来负责待办事项的创建 todosFactory insertTodo function todo return http post baseUr
  • 是否可以将请求标头添加到 CORS 预检请求中?

    我有一个从外部服务器 不是服务器 访问 API 的网站 为网站提供服务 通过简单的XmlHttpRequest 见下文 那个API 需要将用于访问服务的 API 密钥添加为请求标头 然而 正如这些CORS https developer m
  • 尝试使用 php 发送 POST 请求,无论我做什么,我都会收到“HTTP ERROR 500”

    为了发出 HTTP 请求 有人建议我尝试使用 PHP 并给了我一段代码 url https example com dashboard api data array to gt PHONE NUMBER from gt SENDER ID
  • 在 HTTP 标头中发送 UTF-8 值会导致 Mojibake

    我想使用 servlet 发送阿拉伯语数据HTTPServletResponse给客户 我正在尝试这个 response setCharacterEncoding UTF 8 response setHeader Info arabicWo
  • 如何从 Retrofit2 获取字符串响应?

    我正在做 android 正在寻找一种方法来执行超级基本的 http GET POST 请求 我不断收到错误 java lang IllegalArgumentException Unable to create converter for
  • 扩展(十进制,例如 400.1、401.4 等)HTTP 状态代码从何而来?

    我越来越多地看到十进制样式 HTTP 状态代码的激增 而且我似乎找不到任何 RFC 或其他 IETF 建议 甚至 W3C 草案或除 Microsoft IIS 文档之外的其他内容 请参阅https support microsoft com

随机推荐

  • 【满分】【华为OD机试真题2023 JAVA&JS】分界线

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 分界线 时间限制 1s 空间限制 32MB 限定语言 不限 题目描述 电视剧 分界线 里面有一个片段 男主为了向警察透露案件细节 且不暴露自己 于是将报刊上的字剪切下来 剪拼成匿
  • [安洵杯 2019]easy_serialize_php

    安洵杯 2019 easy serialize php 本题考点 反序列化的字符串逃逸 变少 extract 变量覆盖 思考过程 首先代码审计可以看到几个关键点 function filter img filter arr array ph
  • 项目1-PM2.5预测

    文章目录 项目1 PM2 5预测 友情提示 项目描述 数据集介绍 项目要求 数据准备 环境配置 安装 预处理 提取特征 1 提取特征 2 归一化 将训练数据分割成 训练集 和 验证集 训练 测试 预测 保存预测到CSV文件 项目1 PM2
  • Gradle 的编译周期

    Project build gradle 多个Task 多个action 一个代码块 在编译过程中 Gradle 会根据 build 相关文件 聚合所有的project和task 执行task 中的 action 依赖逻辑 几乎所有的Tas
  • 2018网易前端实习笔试题

    前端时间做了网易前端实习的笔试题 偶像想起 总结一下 前面的选择题 我就不一一细说了 主要考察的是对于前端的基础 以及计算机基础 这次主要讲下算法题 所有算法我均用js所写 不同语言思路均相同 以下都是我对题目的简述 1 小易学了集合 已知
  • CTF show WEB7-8

    题目网站https ctf show web7 点开其中一篇文章 输入id 1 1存在全部文章内容 说明为整形注入 1 爆库名 web7 当输入为id 1 or ascii substr database 1 1 119时出现文章内容 证明
  • 如何制作 linux 系统 U盘启动盘

    原贴 如何制作 linux 系统 U盘启动盘 Will kkc的博客 CSDN博客 linux系统启动盘 1 制作linux 系统的U盘启动盘 需要选择ISO 模式 给大家推荐几个制作相关软件以及相关制作过程 UltraISO rufus
  • Nginx将日志输送到Rsyslog服务

    直接使用Nginx记录日志 在多台服务器的情况下日志会过于分散不容易管理 不过nginx在1 7 1版本以后 可以使用Rsyslog来记录日志 配置过程如下 一 Nginx配置文件 该配置也可以实现将nginx日志通过rsyslog服务输送
  • PHP中的正规表达式

    PHP继承 NIX的一贯传统 完全支持正规表达式的处理 正规表达式提供了一种高级的 但不直观的字符串匹配和处理的方法 用过PERL的正规表达式的朋友都知道 正规表达式的功能非常强大 但学起来不是那么容易 比如 这段有效却难以理解的代码足够使
  • 大数据毕业设计 校园学生一卡通数据分析与可视化 - python

    文章目录 0 项目简介 任务 1数据导入与预处理 任务 1 1 探查数据质量并进行缺失值和异常值处理 1 1 2检查重复值 1 1 3数据内容总览 1 1 4数据分布总览 1 1 5消费金额和消费次数观察消费金额和消费次数的散点图 1 1
  • 企业微信 vue ios 出现 63002,INVALID SIGNATURE问题

    下面是官网的说法 可以先按下面的方法进行排查排查 概述 微信开放文档 1 确认签名算法正确 可用http mp weixin qq com debug cgi bin sandbox t jsapisign 页面工具进行校验 2 确认con
  • [创业之路-71] :创业思维与打工思维的区别

    其实打工思维和创业思维最核心的本质区别是你是否愿意去尝试 很多时候我打工的时候老板没发现我的潜质 所以我去创业了 这个没有 你打工的时候一定有一项极其长的长项 只不过当时你可能也没意识到 老板没意识到 所谓创业者和职场人没有本质的差异 但创
  • 如何使用Python的Pyecharts制作漂亮的Tree 树图?

    Pyecharts是一个基于Echarts的Python数据可视化库 可以很容易地生成各种漂亮的图表 本文介绍如何使用Pyecharts绘制Tree树图 安装Pyecharts 使用pip安装Pyecharts pip install py
  • 在IDE中使用Bito - 一个不需要VPN就可以使用的chatgpt

    文章目录 在IDE中使用Bito 什么是Bito 为什么要使用Bito Bito可以做什么 如何在IDE中安装Bito 使用Bito 在IDE中使用Bito 什么是Bito 用他自己的介绍就是 Bito s AI helps develop
  • fetch整个仓库 github_【每日github】B站开源的播放器、markdown插件等

    第15篇 1 Modernizr Modernizr Modernizr帮助我们检测浏览器是否实现了某个feature 如果实现了那么开发人员就可以充分利用这个feature做一些工作 反之没有实现开发人员也好提供一个fallback 所以
  • neo4j清空数据库

    版本为 neo4j community 4 4 6 使用py2neo删除 fimport py2neo from py2neo import Graph Node Relationship NodeMatcher g Graph http
  • Git(六):基本命令(2):复位、修改、分支合并与日志

    目录 9 reset 复位 9 1 描述 9 2 基本用法 9 2 1 回滚添加操作 9 2 2 回滚最近一次提交 9 2 3 回滚最近几次提交 9 2 4 回滚 pull 9 2 5 回滚 merge 9 2 6 区别 9 2 7 中断的
  • Velocity不用愁!Velocity系统的前端工程化之路

    Velocity是一个基于Java的Web页面模版引擎 十多年前 Velocity将Java代码从Web页面中分离出来 使得开发者能够并行网页开发和Java开发 随着十年前后端分离的浪潮涌动 回首再面对这些基于Velocity的旧系统 无论
  • 狂神说Linux学习笔记整理

    1 Linux简介 Linux 全称GNU Linux 是一种免费使用和自由传播的类UNIX操作系统 其内核由林纳斯 本纳第克特 托瓦兹于1991年10月5日首次发布 它主要受到Minix和Unix思想的启发 是一个基于POSIX的多用户
  • 最强Http缓存策略之强缓存和协商缓存的详解与应用实例

    HTTP缓存是指浏览器或者代理服务器将已经请求过的资源保存到本地 以便下次请求时能够直接从缓存中获取资源 从而减少网络请求次数 提高网页的加载速度和用户体验 缓存分为强缓存和协商缓存两种模式 一 强缓存 强缓存是指浏览器直接从本地缓存中获取