浏览器http缓存问题
一、什么是浏览器缓存
浏览器将请求过的资源(html、js、css、img)等,根据缓存机制,拷贝一份副本存储在浏览器的内存或者磁盘上。如果下一次请求的url相同时则根据缓存机制决定是读取内存或者磁盘上的数据还是去服务器请求资源文件
缓存通过url来判断,如果url不同则是新的资源。所以我们开发时前端会将一些js、css等文件在后面加hash值来避免资源更新时浏览器仍读取缓存文件,导致需要刷新才能获取新的资源的问题
这种做法虽然解决了js、css等文件的更新,这种加hash的就不在这篇文章说了,具体方法上网查即可,但是对于index.html这样的文件由于不能加hash值,则仍然会存在当资源更新了,但是仍然读取缓存文件的问题。
二、与缓存相关的状态码
| 200 ok | 从浏览器下载的最新资源 |
| 200 (from memory cache) | 不进行http请求,直接从浏览器内存中读取的资源,页面关闭,则资源释放,一般一些脚本、图片、文字等会存在内存中 |
| 200 (from disk cache) | 不进行http请求,直接从磁盘中读取的资源,页面关闭,资源仍然存在,除非清除缓存,一般一些非脚本文件会存在磁盘中,例如html、css文件 |
| 304 (not modified) | 请求了服务器,但是由于服务器资源没有更新,所以仍使用内存中的资源 |
三、缓存相关的http header介绍
| http header | 介绍 |
| cache-control | response header or request header;指定缓存机制,优先级最高 |
| expires | response header or request header;指定缓存的过期时间(现在浏览器一般设置cache-control,设置expires是为了兼容http1.0) |
| last-modified | response header;资源的最后修改时间 |
| etag | response header;资源的唯一标识符 |
| if-modified-since | request header;缓存的服务器资源的最后修改时间 |
| if-none-match | request header;缓存的服务器资源的唯一标识 |
1. 强缓存
不会进行http请求,读取的是内存中的资源,直到缓存失效
涉及到的状态码:
- 200(from memory cache)
- 200(from disk cache)
涉及到的http header:
- cache-control
优先级最高,所有的缓存机制看到 cache-control 都要服从它
强缓存:设置max-age在这个时间内都不进行http请求,从缓存中读取
| cache-control | 描述 |
| no-store | 请求和相应都不缓存 |
| no-cache | 协商缓存,相当于cache-control:max-age=0 |
| max-age | 指定多少秒后资源过期(强缓存) |
- expires
这个是为了兼容http1.0,由于客户端可以修改时间,所以,expires优先级低,缓存策略以cache-control为准
2. 协商缓存
在第一次请求服务器时,服务器会返回资源,并且返回一个资源的缓存标识,一起存到浏览器的缓存数据库。当第二次请求资源时,浏览器会首先将缓存标识发送给服务器,服务器拿到标识后判断标识是否匹配,如果不匹配,表示资源有更新,服务器会将新数据和新的缓存标识一起返回到浏览器;如果缓存标识匹配,表示资源没有更新,并且返回 304 状态码,浏览器就读取本地缓存服务器中的数据。
涉及到的状态码:
- 304 not modified
- 200 ok
涉及到的请求头
- last-modified (响应头)/ if-modified-since(请求头)
当浏览器第一次请求时,服务端返回资源的同时,会在响应头中添加last-modified,表示资源的最后修改时间,浏览器在第二次请求这个url时会在请求头中带上if-modified-since请求头,值为上一次请求的last-modified,用来询问该文件是否被修改过。
但是last-modified时间只能精确到秒,且无法识别出内容没有修改过的文件,只要修改时间变了就算变动,因此有了etag
- etag(响应头) / ig-none-match(请求头)
etag解决了last-modified的问题,当etag和last-modified同时存在时则以etag为准
nginx的etag计算方式:计算页面文件的最后修改时间,将文件最后修改时间的秒级Unix时间戳转为16进制作为etag的第一部分 计算页面文件的大小,将大小字节数转为16进制作为etag的第二部分。
etag两种类型:
强etag:
不论实体发生多么细微的变化都会改变其值
强ETag表示形式:"22FAA065-2664-4197-9C5E-C92EA03D0A16"。
弱etag:
弱 ETag 值只用于提示资源是否相同。只有资源发生了根本改变产 生差异时才会改变 ETag 。这时,会在字段值最开始处附加 W/。
弱ETag表现形式:W/"22FAA065-2664-4197-9C5E-C92EA03D0A16"。
浏览器第二次请求上次请求过的url时,浏览器会在HTTP请求头添加一个If-None-Match的标记,用来询问服务器该文件有没有被修改。
四、项目遇到的问题
- 项目上线后用户需手动刷新页面才能获取新的资源
产生原因:http请求没有设置缓存机制(cache-control或者expires),导致浏览器不知道以什么方式缓存。这种情况一般默认为强缓存,强缓存时间根据一定的计算方式获得,在这个时间段内不会进行网络请求,返回的状态码为200(from disk cache)或者200(from memory cache)
解决办法:
针对不能加hash值又想要随时获取最新资源的html文件,应该设置请求头 cache-control:no-cache,相当于cache-control:max-age=0
- 奇怪的问题与排查
现象:nginx并没有配置cache-control或者expires,但是有时却不需要刷新就可以返回最新的资源(200 ok),而有时则返回200 from disk cache。
排查:
查看http的header信息,发现差别在if-modified-sine这个请求头上,返回200 ok的请求头会携带if-modified-sine,而返回200 from disk cache的请起头中没有携带if-modified-sine。
查了一些资料终于找到原因,原因如下:
if-modified-sine的值是第一次报文中 last-modified 的值
为什么会有条件请求字段呢?是因为缓存过期了,所以浏览器会从缓存中查找是否有etag、last-modified字段(注意,缓存是缓存的整个报文,而不仅仅是body部分),有的话,就在请求中带上,向服务器发起协商缓存请求。如果服务器发现资源没有改变,就返回304响应,浏览器就知道,本地缓存中的这个数据资源可以继续使用。(304响应是没有body体的,只有头字段等元信息)也就是说,只有在缓存过期的情况下,请求报文中才会有条件请求的相关字段。什么情况下,缓存会过期呢?如下:
- cache-control: max-age=0
- cache-control: no-cache
- 响应报文根本就没有返回任何关于cache有效期的头字段: cache-control / expire / progma 。那么看是否返回了 last-modified ,如果有该header,浏览器可以使用 Heuristic 算法计算出一个通用的缓存时间 (Date - last-modified) * 10%
第三点原因就是项目中遇到的奇怪现象的解释。
文章借鉴:https://segmentfault.com/q/1010000007008829 浏览器缓存带来的前端项目更新问题及解决方法_浏览器缓存的数据,如果服务器的数据有变化怎么办-CSDN博客
相关文章:
浏览器http缓存问题
一、什么是浏览器缓存 浏览器将请求过的资源(html、js、css、img)等,根据缓存机制,拷贝一份副本存储在浏览器的内存或者磁盘上。如果下一次请求的url相同时则根据缓存机制决定是读取内存或者磁盘上的数据还是去服务器请求资源文件…...
结构化Prompt:让大模型更智能的秘诀
一、结构化提示词 1. 什么是结构化? 结构化: 对信息进行组织,使其遵循特定的模式和规则,从而方便有效理解信息。结构化的思想在各类文本中都得到了广泛应用,例如文章、书籍中都使用了标题、子标题、段落等语法结构。结构化 Prompt 的思维方…...
威联通NAS部署openwrt软路由保姆级教程附镜像文件
创作立场:原创不易,拒绝搬运~ hello 大家好,我是你们的老伙伴,稳重的大王~ 本期教程为大家分享,怎么在NAS里面部署软路由,下面是软路由的镜像文件,有两个版本,400M的是定制版~ Sh…...
《计算机网络(第7版)-谢希仁》期末考试复习题和答案(总结整理)
目录 前言: 一、选择题。 二、填空题。 三、名词解释。 四、简答题。 前言: 这个自动标题自己带了序号,一开始想全部选项和题号都改过来的,结果一看一百多个全是,懒得改了 一、选择题。 1、广域网覆盖的地理范围…...
windows和mac共享文件夹访问教程
mac共享文件夹,windows访问: mac上开启文件夹共享,并添加文件夹和用户,然后windows 上 在windows上快捷键 win r 打开运行,按如下格式输入mac设备的IP地址: 就可以访问了: windows共享文件夹…...
【PPTist】网格线、对齐线、标尺
前言:本篇文章介绍辅助我们摆放元素位置的几个功能 一、网格线功能 网格线主要是用来辅助我们对齐元素的,右键可以选择使用哪种网格线,以及关闭和打开 显示效果就是图中的这种效果。但是强迫症有点难受,它底部没对齐啊啊啊 不…...
Leetcode3218. 切蛋糕的最小总开销 I
题目描述: 有一个 m x n 大小的矩形蛋糕,需要切成 1 x 1 的小块。 给你整数 m ,n 和两个数组: horizontalCut 的大小为 m - 1 ,其中 horizontalCut[i] 表示沿着水平线 i 切蛋糕的开销。verticalCut 的大小为 n - 1 …...
ECCV-2024 | 指令不够用、大模型来生成!BEVInstructor:基于BEV感知和大模型的视觉语言导航指令生成
作者:Sheng Fan, Rui Liu, Wenguan Wang, and Yi Yang 单位:浙江大学 原文链接:Navigation Instruction Generation with BEV Perception and Large Language Models (https://link.springer.com/chapter/10.1007/978-3-031-726…...
【UE5.3.2 】引擎中安装RiderLink插件
Rider会提示你安装这个插件选择在引擎中安装 Running AutomationTool... Using bundled DotNet SDK version: 6.0.302 Starting AutomationTool... Parsing command line: BuildPlugin -Unversioned -Plugin=C:\Users\zhangbin\AppData\Local\...
【HarmonyOS 5.0】第十二篇-ArkUI公共属性(一)
一、公共样式类属性 ArkUI框架提供的基础组件直接或者间接的继承自 CommonMethod , CommonMethod 中定义的属性样式属于公共样式。下面就来学习这些样式 1.1.尺寸设置 宽高设置 设置组件的宽高,缺省时使用组件自身内容的宽高,比如充满父布…...
京准电钟解读,NTP网络授时服务器如何提升DCS系统效率
京准电钟解读,NTP网络授时服务器如何提升DCS系统效率 京准电钟解读,NTP网络授时服务器如何提升DCS系统效率 NTP 网络授时服务器为防火墙内的网络设备、终端、服务器提供准确、可靠和安全的高精度卫星时间参考,可为它支持数万台支持标准的网…...
4.银河麒麟V10(ARM) 离线安装 MySQL
1. 系统版本 [rootga-sit-cssjgj-db-01u ~]# nkvers ############## Kylin Linux Version ################# Release: Kylin Linux Advanced Server release V10 (Lance)Kernel: 4.19.90-52.39.v2207.ky10.aarch64Build: Kylin Linux Advanced Server release V10 (SP3) /(La…...
Redis四种模式在Spring Boot框架下的配置
1. 单机模式 application.properties 配置: spring.redis.host127.0.0.1 spring.redis.port6379 spring.redis.passwordyourpasswordspring.redis.host: 该配置指定 Redis 服务器的主机地址。在单机模式下,通常是本地 Redis 实例(127.0.0.1…...
Golang的性能监控指标
Golang的性能监控指标 一、介绍 是一种高性能的编程语言,因其并发模型和内建的性能监控工具而备受开发者青睐。在实际开发中,我们需要了解一些重要的性能监控指标,以便及时发现和解决性能问题。本文将介绍Golang中常用的性能监控指标…...
基于GAN和DenseNett组合的调制信号分类网络(源码)
(需要源码请私信或评论) 生成对抗网络(GAN)原理 生成对抗网络(GAN)是一种革命性的深度学习模型,在无监督学习领域取得了显著进展。其核心思想基于 二人零和博弈 ,通过生成模型和判别模型的相互竞争实现高质量的数据合成。GAN由Ian Goodfellow等人于2014年首次提出,随后在图…...
uniapp 项目基础搭建(vue2)
一 .创建项目 创建项目可以通过工具创建,也可以通过脚手架下载 1.通过工具创建 2.通过脚手架下载 安装脚手架 npm install -g vue/cli 下载项目模板 vue create -p dcloudio/uni-preset-vue 项目名称 二. 下载相关依赖 1. 项目默认是没有package.json文件的&…...
中关村科金外呼机器人智能沟通破解营销难题
当今,传统的营销方式在效率、成本控制、客户管理等方面逐渐显现出局限性,难以满足现代企业的需求。如何提升营销效率、降低运营成本、有效管理客户会员,成为企业的难题。中关村科金外呼机器人通过智能化沟通技术,为企业提供了一站…...
【Linux】处理用户输入
一、基本介绍 1、如何传递参数 向shell脚本传递数据的最基本方法就是通过命令行参数。如下,这条命令会向test.sh脚本传递10和20这两个参数。 ./test.sh 10 20 2、如何读取参数 bash shell会将所有的命令行参数都指派给称作位置参数(positional parame…...
flask后端开发(1):第一个Flask项目
目录 一、Helloworddebug、host、port的配置 gitcode地址: https://gitcode.com/qq_43920838/flask_project.git 一、Helloword 一般是会创建两个文件夹和app.py app.py from flask import FlaskappFlask(__name__)app.route(/) def hello_world():return Hello…...
Highcharts 饼图:数据可视化利器
Highcharts 饼图:数据可视化利器 引言 在数据可视化的领域中,饼图作为一种经典且直观的图表类型,被广泛应用于各种行业和场景中。Highcharts,作为一个功能强大且易于使用的JavaScript图表库,为我们提供了创建交互式和…...
Linux进程(下)
上一篇文章介绍了进程的概念和进程的状态,但进程的知识还有很多,本文继续进行讲解。进程的管理指令之前提到过许多对进程进行管理的指令,但没有进行讲解,在这里统一聊聊。核心指令有四个 ps,top,kill&#…...
NTC热敏电阻温度解算:轻量级Beta模型C++库
1. 项目概述Thermistor 是一个轻量级 C 库,专为嵌入式系统中 NTC(负温度系数)热敏电阻的温度解算而设计。其核心目标并非提供通用传感器抽象层,而是以最小资源开销、最高计算确定性,完成从原始 ADC 采样值到物理温度值…...
降AI后格式乱了怎么修:Word格式修复操作指南
降AI后格式乱了怎么修:Word格式修复操作指南 上周室友第一次用降AI工具,操作错了好几步,差点浪费机会。觉得有必要写一篇详细教程。 我用的是嘎嘎降AI(www.aigcleaner.com),4.8元一篇,达标率9…...
论文降AI之前要做哪些AIGC自检:完整自查流程
论文降AI之前要做哪些AIGC自检:完整自查流程 被问了太多次降AI前自检相关的问题,写一篇完整教程。 主要工具是嘎嘎降AI(www.aigcleaner.com),4.8元。第一次用的话有些细节知道和不知道差别挺大的。 操作前准备 开始…...
2025最权威的五大降重复率方案推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 当下,各种各样的AI生成内容检测系统变得越发精密,这给那些依赖AI进行…...
video-object-removal错误排查手册:常见问题与解决方法汇总
video-object-removal错误排查手册:常见问题与解决方法汇总 【免费下载链接】video-object-removal Just draw a bounding box and you can remove the object you want to remove. 项目地址: https://gitcode.com/gh_mirrors/vi/video-object-removal video…...
NomNom存档编辑器:3分钟掌握《无人深空》终极修改秘籍
NomNom存档编辑器:3分钟掌握《无人深空》终极修改秘籍 【免费下载链接】NomNom NomNom is the most complete savegame editor for NMS but also shows additional information around the data youre about to change. You can also easily look up each item indi…...
循环神经网络:浅析RNN、LSTM与BiLSTM的算法思想
NLP-AHU-015 本文配图LSTM部分搬运了Understanding LSTM Networks -- colahs blog 循环神经网络是深度学习领域中处理序列数据的核心架构,通过引入循环连接机制,使网络能够处理具有时间依赖关系的序列数据。然而,传统RNN在长序列训练中面临…...
Unity VideoPlayer常见报错解析:First video frame not zero与Color Standard问题实战
1. 解析"First video frame not zero"报错 遇到Unity VideoPlayer报出"First video frame not zero"时,很多开发者会一头雾水。这个错误直译过来就是"第一帧视频不是从零开始的",听起来有点抽象。我用个生活中的例子解释&…...
从JDBC到MyBatis:手把手调试源码,看一个`String`类型的`id`参数如何走完数据库查询与映射的全流程
从JDBC到MyBatis:手把手调试源码,看一个String类型的id参数如何走完数据库查询与映射的全流程 在Java持久层框架的演进历程中,MyBatis凭借其灵活的SQL控制能力和优雅的ORM映射机制,成为众多开发者处理复杂数据库操作的首选工具。…...
