当前位置: 首页 > news >正文

CDN ❀ Http协议标准缓存字段梳理

文章目录

  • 1. 背景介绍
  • 2. 测试环境搭建
  • 3. 缓存字段
    • 3.1 Expires
    • 3.2 Cache-Control
    • 3.3 协商缓存

1. 背景介绍

Http协议标准有RFC定义好的请求和响应头部字段用于进行缓存设置,本文主要进行介绍缓存功能相关的头部字段及其使用方法。在使用CDN功能是,协议标准缓存字段的识别和判断是十分重要的!

缓存字段优先级如下:

  • Cache-Control(Private > Max-age) > Expires
  • Etag > 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定义好的请求和响应头部字段用于进行缓存设置&#xff0c;本文主要进行介绍缓存功能相关的头部字段及其使用方法。在使用CDN功能是&#xff0c;协议标…...

浅谈NODE的NPM命令和合约测试开发工具HARDHAT

$ npm install yarn -g # 将模块yarn全局安装 $ npm install moduleName # 安装模块到项目目录下 默认跟加参数 --save 一样 会在package文件的dependencies节点写入依赖。 $ npm install -g moduleName # -g 的意思是将模块安装到全局&#xff0c;具体安装到磁盘哪个位置&…...

k8s-pod 实战六 (如何在不同的部署环境中调整startupprobe的参数?)

在不同的部署环境中(如开发、测试、生产环境),你可能希望对 startupProbe 的参数进行调整,以适应不同的需求和条件。以下是几种常见的方法和实践: 方法一:使用 Kustomize 1. 目录结构 假设你的项目目录结构如下: my-app/ ├── base/ │ └── deployment.yaml …...

和服务端系统的通信

首先web网站 前端浏览器 和 后端系统 是通过HTTP协议进行通信的 同步请求&异步请求&#xff1a; 同步请求&#xff1a;可以从浏览器中直接获取的&#xff08;HTML/CSS/JS这样的静态文件资源)&#xff0c;这种获取请求的http称为同步请求 异步请求&#xff1a;js代码需要到服…...

python 实现perfect square完全平方数算法

python 实现perfect square完全平方数算法介绍 完全平方数&#xff08;Perfect Square&#xff09;是一个整数&#xff0c;它可以表示为某个整数的平方。例如&#xff0c;1,4,9,16,25,… 都是完全平方数&#xff0c;因为 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)整除的概念

前言 在信息安全数学基础中&#xff0c;整除是一个基础且重要的概念。它涉及整数之间的特定关系&#xff0c;对于理解数论、密码学等领域至关重要。以下是对整除概念的详细阐述&#xff1a; 一、定义 设a, b是任意两个整数&#xff0c;其中b ≠ 0。如果存在一个整数q&#xff0…...

SearchGPT与谷歌:早期分析及用户反馈

光年AI系统&#xff0c;作为先进AI技术的成果&#xff0c;推出了一个AI驱动搜素引擎的原型&#xff0c;类似于SearchGPT。 该发布引起了广泛的关注&#xff0c;并引发了关于其是否有能力与Google竞争的讨论。 然而&#xff0c;早期的研究和用户反馈表明&#xff0c;虽然Searc…...

VUE饿了么UPload组件自定义上传

代码&#xff1a; 1.视图&#xff1a; <el-dialog :title"dialogTitle" width"30%" :visible.sync"dialogFormVisible" :destroy-on-close"true"><el-form ref"fileForm" class"items-align" ><e…...

2.1概率统计的世界

欢迎来到概率统计的世界&#xff01;在量化交易中&#xff0c;概率统计是至关重要的工具。通过理解概率&#xff0c;我们可以用数学的方法来描述市场行为&#xff0c;预测未来走势&#xff0c;并制定交易策略。让我们一起从基础概念开始&#xff0c;逐步深入&#xff0c;揭开概…...

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 进行图像处理&#xff1a;HSV 范围筛选实现PS抠图效果 在计算机视觉和图像处理领域&#xff0c;OpenCV 是一个非常强大的库&#xff0c;能够帮助我们执行各种图像操作。在这篇博客中&#xff0c;我们将通过一个简单的示例演示如何使用 OpenCV 和 NumPy 来…...

IIS中间件

中间件 中间件是一类软件&#xff0c;为应用程序、服务和组件提供一个通用的服务层。 主要功能 通信&#xff1a;提供通信框架&#xff0c;帮助不同系统与应用之间进行数据交换和通信 事务管理、资源管理 安全服务&#xff1a;提供认证、授权、加密等安全策略 数据访问&a…...

BMP280气压传感器详解(STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 3.传感器数据获取流程 三、程序设计 main.c文件 bmp280.h文件 bmp280.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 BMP280是一款基于博世公司APSM工艺的小封装低功耗数字复合传感器&#xff0c;它可以测…...

DWPD指标:为何不再适用于大容量SSD?

固态硬盘&#xff08;Solid State Drives, SSD&#xff09;作为计算机行业中最具革命性的技术之一&#xff0c;凭借其更快的读写速度、增强的耐用性和能效&#xff0c;已经成为大多数用户的首选存储方案。然而&#xff0c;如同任何其他技术一样&#xff0c;SSD也面临自身的挑战…...

路由器的固定ip地址是啥意思?固定ip地址有什么好处

‌在当今数字化时代&#xff0c;‌路由器作为连接互联网的重要设备&#xff0c;‌扮演着举足轻重的角色。‌其中&#xff0c;‌路由器的固定IP地址是一个常被提及但可能让人困惑的概念。‌下面跟着虎观代理小二一起将深入探讨路由器的固定IP地址的含义&#xff0c;‌揭示其背后…...

Java——踩坑Arrays.asList()

坑1&#xff1a;不能直接使用 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)配置

一. 实验简介 本来前缀列表是要和访问控制列表放在一起讲的&#xff0c;但是这里单拎出来是为了更详细的讲解两者的区别 1.前缀列表针对IP比访问控制更加灵活。 2.前缀列表在后面被引用时是无法对数据包进行过滤的 实验拓扑 二. 实验目的 R4路由器中只引入子网LoopBack的…...

每日OJ_牛客_电话号码(简单哈希模拟)

目录 牛客_电话号码&#xff08;简单哈希模拟&#xff09; 解析代码 牛客_电话号码&#xff08;简单哈希模拟&#xff09; 电话号码__牛客网 解析代码 #include <iostream> #include <unordered_map> #include <set> #include <string> using name…...

鸿蒙轻内核M核源码分析系列十二 事件Event

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 轻内核M核源码分析系列一 数据结构-双向循环链表 轻内核M核源码分析系列二 数据结构-任务就绪队列 鸿蒙轻内核M核源码分析系列三 数据结构-任务排序链表 轻…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

redis和redission的区别

Redis 和 Redisson 是两个密切相关但又本质不同的技术&#xff0c;它们扮演着完全不同的角色&#xff1a; Redis: 内存数据库/数据结构存储 本质&#xff1a; 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能&#xff1a; 提供丰…...

API网关Kong的鉴权与限流:高并发场景下的核心实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中&#xff0c;API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关&#xff0c;Kong凭借其插件化架构…...

沙箱虚拟化技术虚拟机容器之间的关系详解

问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西&#xff0c;但是如果把三者放在一起&#xff0c;它们之间到底什么关系&#xff1f;又有什么联系呢&#xff1f;我不是很明白&#xff01;&#xff01;&#xff01; 就比如说&#xff1a; 沙箱&#…...

《信号与系统》第 6 章 信号与系统的时域和频域特性

目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...

客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践

01技术背景与业务挑战 某短视频点播企业深耕国内用户市场&#xff0c;但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大&#xff0c;传统架构已较难满足当前企业发展的需求&#xff0c;企业面临着三重挑战&#xff1a; ① 业务&#xff1a;国内用户访问海外服…...

DAY 45 超大力王爱学Python

来自超大力王的友情提示&#xff1a;在用tensordoard的时候一定一定要用绝对位置&#xff0c;例如&#xff1a;tensorboard --logdir"D:\代码\archive (1)\runs\cifar10_mlp_experiment_2" 不然读取不了数据 知识点回顾&#xff1a; tensorboard的发展历史和原理tens…...

渗透实战PortSwigger Labs指南:自定义标签XSS和SVG XSS利用

阻止除自定义标签之外的所有标签 先输入一些标签测试&#xff0c;说是全部标签都被禁了 除了自定义的 自定义<my-tag onmouseoveralert(xss)> <my-tag idx onfocusalert(document.cookie) tabindex1> onfocus 当元素获得焦点时&#xff08;如通过点击或键盘导航&…...