CDN ❀ Http协议标准缓存字段梳理
文章目录
- 1. 背景介绍
- 2. 测试环境搭建
- 3. 缓存字段
- 3.1 Expires
- 3.2 Cache-Control
- 3.3 协商缓存
1. 背景介绍
Http协议标准有RFC定义好的请求和响应头部字段用于进行缓存设置,本文主要进行介绍缓存功能相关的头部字段及其使用方法。在使用CDN功能是,协议标准缓存字段的识别和判断是十分重要的!
缓存字段优先级如下:
Cache-Control(Private > Max-age) > ExpiresEtag > Last-Modified
2. 测试环境搭建
安装Nginx服务,且配置conf.d子配置文件目录(实验环境ip为内网地址)
# 在已经安装好的nginx服务conf主配置文件的http模块下添加如下配置
[root@localhost nginx]# cat conf/nginx.conf | grep 'conf.d'include /middleware/nginx/conf.d/*.conf; # 该配置代表http模块将conf.d目录下的conf后缀文件也作为配置文件进行加载# 创建备用配置文件目录并且创建新的端口服务
[root@localhost nginx]# mkdir conf.d
[root@localhost nginx]# cat conf.d/ceshi01.conf
server {listen 8081; # 新端口使用8081server_name localhost;location /ceshi01 {root /middleware/nginx/conf.d/data; # ceshi01访问路径为/middleware/nginx/conf.d/data/ceshi01/ceshi.htmlindex /ceshi01/ceshi.html;default_type text/html;}location /ceshi02 {root /middleware/nginx/conf.d/data; # ceshi02访问路径为/middleware/nginx/conf.d/data/ceshi02/ceshi.htmlindex /ceshi02/ceshi.html;default_type text/html;}error_page 403 404 /middleware/nginx/conf.d/data/40x.html; # 403和404状态码进行特殊配置location = /middleware/nginx/conf.d/data/40x.html {root html;}
}# 准备目标访问html文件
[root@localhost nginx]# cat /middleware/nginx/conf.d/data/ceshi01/ceshi.html
{'uasername': 'ceshi01', 'age': 27}
[root@localhost nginx]# cat /middleware/nginx/conf.d/data/ceshi02/ceshi.html
{'uasername': 'ceshi02', 'age': 27}# 重启Nginx服务
[root@localhost nginx]# ./sbin/nginx -t # 重启服务前必须进行检测配置文件是否可以正确执行,这是一个非常好的习惯!
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful # 配置文件可以执行无错误
[root@localhost nginx]# ./sbin/nginx -s reload# 功能验证
[root@localhost nginx]# curl -Lv 'http://9.134.244.180:8081/ceshi02/ceshi.html'
* Trying 9.134.244.180:8081...
* Connected to 9.134.244.180 (9.134.244.180) port 8081
> GET /ceshi02/ceshi.html HTTP/1.1
> Host: 9.134.244.180:8081
> User-Agent: curl/8.9.1
> Accept: */*
>
* Request completely sent off
< HTTP/1.1 200 OK
< Server: nginx/1.25.3
< Date: Wed, 04 Sep 2024 07:44:30 GMT
< Content-Type: text/html
< Content-Length: 36
< Last-Modified: Thu, 29 Aug 2024 10:54:41 GMT
< Connection: keep-alive
< ETag: "66d05371-24"
< Accept-Ranges: bytes
<
{'uasername': 'ceshi02', 'age': 27}
* Connection #0 to host 9.134.244.180 left intact
3. 缓存字段
3.1 Expires
Expire字段代表一个固定的缓存过期时间,为0代表缓存过期,需要注意的是,在添加了Expire之后,响应会自动加入Cache-Control: max-age=xxx的响应头部,而这个缓存时间等同于Expire设置的过期时间。
# Nginx配置如下location /ceshi01 {root /middleware/nginx/conf.d/data;index /ceshi01/ceshi.html;default_type text/html;expires 1M; # 设置过期时间为1个月之后}# 结果验证
[root@localhost nginx]# curl -Lv 'http://9.134.244.180:8081/ceshi01/ceshi.html'
* Trying 9.134.244.180:8081...
* Connected to 9.134.244.180 (9.134.244.180) port 8081
> GET /ceshi01/ceshi.html HTTP/1.1
> Host: 9.134.244.180:8081
> User-Agent: curl/8.9.1
> Accept: */*
>
* Request completely sent off
< HTTP/1.1 200 OK
< Server: nginx/1.25.3
< Date: Wed, 04 Sep 2024 07:51:09 GMT # 当前请求时间
< Content-Type: text/html
< Content-Length: 36
< Last-Modified: Thu, 29 Aug 2024 10:54:32 GMT
< Connection: keep-alive
< ETag: "66d05368-24"
< Expires: Fri, 04 Oct 2024 07:51:09 GMT # 设置缓存过期时间的返回字段
< Cache-Control: max-age=2592000 # CC字段标识
< Accept-Ranges: bytes
<
{'uasername': 'ceshi01', 'age': 27}
* Connection #0 to host 9.134.244.180 left intact
从测试结果可以看出响应头部的 Expires: Fri, 04 Oct 2024 07:51:09 GMT 时间为当前请求时间的一个月之后,而 Cache-Control: max-age=2592000 代表秒数,正好为30days。
3.2 Cache-Control
Cache-Control在http协议标准内为缓存指令头部,可以使用如下配置(加粗为常见配置):
- 是否缓存
public:响应可以被任何对象缓存,包含不可以被缓存的内容;搭配请求方式为POST类型;private:响应只可以被单个用户缓存,不能作为共享缓存(即代理服务器不可以缓存);no-cache:强制要求回源使用协议缓存方式进行验证;no-store:不使用任何缓存功能。
- 到期时间
max-age=<secounds>:设置缓存的最大周期,xxx为秒级配置,时间设置是针对于请求的发起时间而后的过期秒数,如发起时间是a,max-age=1000,即过期时间为a+1000s之后;smax-age=<secounds>:覆盖max-age或Expires头部配置,仅适用于共享缓存(即代理服务器缓存);max-stale=<secounds>:客户端可以允许接受一个过期时间在设置的时间范围内文件;min-fresh=<secounds>:客户端允许获取一个在指定秒数内保持其最新状态的响应;
- 重新加载与验证
must-revalidate:若资源过期,在获取到新资源之前不使用旧资源响应后续请求;proxy-revalidate:与must-revalidate作用一致,但只适用于共享缓存模式;
- 其他
no-transform:不对资源进行转换或转变,Content-Encoding、Content-Range、Content-Type等HTTP头不能由代理修改;only-if-cached:客户端只接受已经缓存的响应,不向源站检测是否有新资源。
# Nginx配置如下location /ceshi01 {root /middleware/nginx/conf.d/data;index /ceshi01/ceshi.html;default_type text/html;# expires 1M;add_header Cache-Control max-age=1024; # 设置CC字段max-age=1024}# 结果验证
[root@localhost nginx]# curl -Lv 'http://9.134.244.180:8081/ceshi01/ceshi.html'
* Trying 9.134.244.180:8081...
* Connected to 9.134.244.180 (9.134.244.180) port 8081
> GET /ceshi01/ceshi.html HTTP/1.1
> Host: 9.134.244.180:8081
> User-Agent: curl/8.9.1
> Accept: */*
>
* Request completely sent off
< HTTP/1.1 200 OK
< Server: nginx/1.25.3
< Date: Wed, 04 Sep 2024 07:56:08 GMT
< Content-Type: text/html
< Content-Length: 36
< Last-Modified: Thu, 29 Aug 2024 10:54:32 GMT
< Connection: keep-alive
< ETag: "66d05368-24"
< Cache-Control: max-age=1024 # 只有CC字段,没有Expires
< Accept-Ranges: bytes
<
{'uasername': 'ceshi01', 'age': 27}
* Connection #0 to host 9.134.244.180 left intact
3.3 协商缓存
协商缓存指的是http协议请求和响应的两个字段配合,如:「Last-Modified + If-Modified-Since」 与 「Etag + If-None-Match」。
Last-Modified:其中包含源头服务器认定的资源做出修改的日期及时间。它通常被用作一个验证器来判断接收到的或者存储的资源是否彼此一致。由于精确度比 ETag 要低,所以这是一个备用机制。包含有 If-Modified-Since 或 If-Unmodified-Since 首部的条件请求会使用这个字段Etag:HTTP 响应头是资源的特定版本的标识符。这可以让缓存更高效,并节省带宽,因为如果内容没有改变,Web 服务器不需要发送完整的响应。而如果内容发生了变化,使用 ETag 有助于防止资源的同时更新相互覆盖(“空中碰撞 - 强校验哈希值不匹配情况”)。
需要注意的是:
- Etag的精细程度比Mtime更高,Mtime无法解决文件内容不变而创建时间改变的场景;
- Mtime的检测周期是秒级,Etag为毫秒级
# Nginx配置如下location /ceshi01 {root /middleware/nginx/conf.d/data;index /ceshi01/ceshi.html;default_type text/html;# expires 1M;add_header Cache-Control no-cache;# add_header Cache-Control no-store;}# 结果验证
[root@localhost nginx]# curl -Lv 'http://9.134.244.180:8081/ceshi01/ceshi.html'
* Trying 9.134.244.180:8081...
* Connected to 9.134.244.180 (9.134.244.180) port 8081
> GET /ceshi01/ceshi.html HTTP/1.1
> Host: 9.134.244.180:8081
> User-Agent: curl/8.9.1
> Accept: */*
>
* Request completely sent off
< HTTP/1.1 200 OK
< Server: nginx/1.25.3
< Date: Wed, 04 Sep 2024 08:30:24 GMT
< Content-Type: text/html
< Content-Length: 36
< Last-Modified: Thu, 29 Aug 2024 10:54:32 GMT
< Connection: keep-alive
< ETag: "66d05368-24"
< Cache-Control: no-cache
< Accept-Ranges: bytes
<
{'uasername': 'ceshi01', 'age': 27}
* Connection #0 to host 9.134.244.180 left intact[root@localhost nginx]# stat /middleware/nginx/conf.d/data/ceshi01/ceshi.htmlFile: /middleware/nginx/conf.d/data/ceshi01/ceshi.htmlSize: 36 Blocks: 8 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 655368 Links: 1
Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2024-08-29 18:54:32.151256443 +0800 # 注意时区,GMT时间需要+8h=国内时间
Modify: 2024-08-29 18:54:32.151256443 +0800
Change: 2024-08-29 18:59:48.756262327 +0800Birth: -
当 Cache-Control: no-cache 配置生效之后,会强制进行协议缓存校验,比对 Last-Modified 字段和源站文件的创建时间,如果不一致则返回新资源。
# Nginx配置修改CC字段为不使用任何缓存location /ceshi01 {root /middleware/nginx/conf.d/data;index /ceshi01/ceshi.html;default_type text/html;# expires 1M;# add_header Cache-Control no-cache;add_header Cache-Control no-store;}# 结果验证
[root@localhost nginx]# curl -Lv 'http://9.134.244.180:8081/ceshi01/ceshi.html'
* Trying 9.134.244.180:8081...
* Connected to 9.134.244.180 (9.134.244.180) port 8081
> GET /ceshi01/ceshi.html HTTP/1.1
> Host: 9.134.244.180:8081
> User-Agent: curl/8.9.1
> Accept: */*
>
* Request completely sent off
< HTTP/1.1 200 OK
< Server: nginx/1.25.3
< Date: Wed, 04 Sep 2024 08:36:57 GMT
< Content-Type: text/html
< Content-Length: 36
< Last-Modified: Thu, 29 Aug 2024 10:54:32 GMT
< Connection: keep-alive
< ETag: "66d05368-24"
< Cache-Control: no-store
< Accept-Ranges: bytes
<
{'uasername': 'ceshi01', 'age': 27}
* Connection #0 to host 9.134.244.180 left intact
当 Cache-Control: no-store 配置生效后,则代表不再使用任何缓存,直接从源站获取目标资源。
相关文章:
CDN ❀ Http协议标准缓存字段梳理
文章目录 1. 背景介绍2. 测试环境搭建3. 缓存字段3.1 Expires3.2 Cache-Control3.3 协商缓存 1. 背景介绍 Http协议标准有RFC定义好的请求和响应头部字段用于进行缓存设置,本文主要进行介绍缓存功能相关的头部字段及其使用方法。在使用CDN功能是,协议标…...
浅谈NODE的NPM命令和合约测试开发工具HARDHAT
$ npm install yarn -g # 将模块yarn全局安装 $ npm install moduleName # 安装模块到项目目录下 默认跟加参数 --save 一样 会在package文件的dependencies节点写入依赖。 $ npm install -g moduleName # -g 的意思是将模块安装到全局,具体安装到磁盘哪个位置&…...
k8s-pod 实战六 (如何在不同的部署环境中调整startupprobe的参数?)
在不同的部署环境中(如开发、测试、生产环境),你可能希望对 startupProbe 的参数进行调整,以适应不同的需求和条件。以下是几种常见的方法和实践: 方法一:使用 Kustomize 1. 目录结构 假设你的项目目录结构如下: my-app/ ├── base/ │ └── deployment.yaml …...
和服务端系统的通信
首先web网站 前端浏览器 和 后端系统 是通过HTTP协议进行通信的 同步请求&异步请求: 同步请求:可以从浏览器中直接获取的(HTML/CSS/JS这样的静态文件资源),这种获取请求的http称为同步请求 异步请求:js代码需要到服…...
python 实现perfect square完全平方数算法
python 实现perfect square完全平方数算法介绍 完全平方数(Perfect Square)是一个整数,它可以表示为某个整数的平方。例如,1,4,9,16,25,… 都是完全平方数,因为 1 1 2 , 4 2 2 , 9 3 2 11^2,42^2,93^2 112,422,93…...
【漏洞复现】某客圈子社区小程序审计(0day)
0x00 前言 █ 纸上得来终觉浅,绝知此事要躬行 █ Fofa:"/static/index/js/jweixin-1.2.0.js"该程序使用ThinkPHP 6.0.12作为框架,所以直接审计控制器即可.其Thinkphp版本较高,SQL注入不太可能,所以直接寻找其他洞. 0x01 前台任意文件读取+SSRF 在 /app/api/c…...
信息安全数学基础(1)整除的概念
前言 在信息安全数学基础中,整除是一个基础且重要的概念。它涉及整数之间的特定关系,对于理解数论、密码学等领域至关重要。以下是对整除概念的详细阐述: 一、定义 设a, b是任意两个整数,其中b ≠ 0。如果存在一个整数q࿰…...
SearchGPT与谷歌:早期分析及用户反馈
光年AI系统,作为先进AI技术的成果,推出了一个AI驱动搜素引擎的原型,类似于SearchGPT。 该发布引起了广泛的关注,并引发了关于其是否有能力与Google竞争的讨论。 然而,早期的研究和用户反馈表明,虽然Searc…...
VUE饿了么UPload组件自定义上传
代码: 1.视图: <el-dialog :title"dialogTitle" width"30%" :visible.sync"dialogFormVisible" :destroy-on-close"true"><el-form ref"fileForm" class"items-align" ><e…...
2.1概率统计的世界
欢迎来到概率统计的世界!在量化交易中,概率统计是至关重要的工具。通过理解概率,我们可以用数学的方法来描述市场行为,预测未来走势,并制定交易策略。让我们一起从基础概念开始,逐步深入,揭开概…...
SpringBoot使用QQ邮箱发送邮件
1.开启POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 设置 -> 账号 -> POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 获取授权码 SpringBoot依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter&l…...
使用 OpenCV 和 NumPy 进行图像处理:HSV 范围筛选实现PS抠图效果
使用 OpenCV 和 NumPy 进行图像处理:HSV 范围筛选实现PS抠图效果 在计算机视觉和图像处理领域,OpenCV 是一个非常强大的库,能够帮助我们执行各种图像操作。在这篇博客中,我们将通过一个简单的示例演示如何使用 OpenCV 和 NumPy 来…...
IIS中间件
中间件 中间件是一类软件,为应用程序、服务和组件提供一个通用的服务层。 主要功能 通信:提供通信框架,帮助不同系统与应用之间进行数据交换和通信 事务管理、资源管理 安全服务:提供认证、授权、加密等安全策略 数据访问&a…...
BMP280气压传感器详解(STM32)
目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 3.传感器数据获取流程 三、程序设计 main.c文件 bmp280.h文件 bmp280.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 BMP280是一款基于博世公司APSM工艺的小封装低功耗数字复合传感器,它可以测…...
DWPD指标:为何不再适用于大容量SSD?
固态硬盘(Solid State Drives, SSD)作为计算机行业中最具革命性的技术之一,凭借其更快的读写速度、增强的耐用性和能效,已经成为大多数用户的首选存储方案。然而,如同任何其他技术一样,SSD也面临自身的挑战…...
路由器的固定ip地址是啥意思?固定ip地址有什么好处
在当今数字化时代,路由器作为连接互联网的重要设备,扮演着举足轻重的角色。其中,路由器的固定IP地址是一个常被提及但可能让人困惑的概念。下面跟着虎观代理小二一起将深入探讨路由器的固定IP地址的含义,揭示其背后…...
Java——踩坑Arrays.asList()
坑1:不能直接使用 Arrsys.asList() 来转换基本类型数据 public static void test1(){// 1、不能直接使用asList来转换基本类型数组int[] arr {1, 2, 3};List list Arrays.asList(arr);System.out.printf("list:%s size:%s class:%s", list, list.size(…...
前缀列表(ip-prefix)配置
一. 实验简介 本来前缀列表是要和访问控制列表放在一起讲的,但是这里单拎出来是为了更详细的讲解两者的区别 1.前缀列表针对IP比访问控制更加灵活。 2.前缀列表在后面被引用时是无法对数据包进行过滤的 实验拓扑 二. 实验目的 R4路由器中只引入子网LoopBack的…...
每日OJ_牛客_电话号码(简单哈希模拟)
目录 牛客_电话号码(简单哈希模拟) 解析代码 牛客_电话号码(简单哈希模拟) 电话号码__牛客网 解析代码 #include <iostream> #include <unordered_map> #include <set> #include <string> using name…...
鸿蒙轻内核M核源码分析系列十二 事件Event
往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 轻内核M核源码分析系列一 数据结构-双向循环链表 轻内核M核源码分析系列二 数据结构-任务就绪队列 鸿蒙轻内核M核源码分析系列三 数据结构-任务排序链表 轻…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
Visual Studio Code 扩展
Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后,命令 changeCase.commands 可预览转换效果 EmmyLua…...
