一文详解Nginx的强缓存和协商缓存

2025-03-10 17:50

本文主要是介绍一文详解Nginx的强缓存和协商缓存,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《一文详解Nginx的强缓存和协商缓存》这篇文章主要为大家详细介绍了Nginx中强缓存和协商缓存的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下...

一、强缓存(Strong Cache)

1. 定义

强缓存直接告诉浏览器:在缓存过期前,无需与服务器通信,直接使用本地缓存。

由服务器通过响应头 Cache-Control 和 Expires 控制。

2. 响应头

 Cache-Control: max-age=3600表示资源在 36python00 秒(1小时) 内有效(优先级高于 Expires)。

Expires: Thu, 31 Dec 2030 23:59:59 GMT指定一个绝对过期时间(依赖于客户端本地时间,可能存在误差)。

3. Nginx 配置示例

location /static/ {
    # 设置强缓存:1年内有效
    add_header Cache-Control "public, max-age=31536000";
    expires 1y;
}

4. 行为

浏览器首次请求资源时,服务器返回资源并附带缓存头。

后续请求时,浏览器直接读取本地缓存(状态码 200 (from disk cache)),不发送请求到服务器

5. 适用场景

静态资源(如 cssjs、图片、字体文件)等长期不变的资源。

二、协商缓存(协商缓存,Weak Cache)

1. 定义

协商缓存要求浏览器 每次向服务器验证缓存是否过期,若未过期则返回 304 Not Modified,继续使用本地缓存。

由服务器通过响应头 Last-Modified 和 ETag 控制。

2. 响应头

 Last-Modified: Wed, 21 Oct 2023 07:28:00 GMT表示资源最后修改时间(精度为秒,可能因时间同步问题失效)。

ETag: "5d8c72a5-264"资源的唯一标识符(哈希值或版本号),精度更高。

3. Nginx 配置示例

location /dynamic/ {
    # 启用协商缓存(默认已支持,无需显式配置)
    add_header Last-Modified "";
android    etag on;
}

4. 行为

浏览器首次请求资源时,服务器返回资源并附带 Last-Modified 或 ETag

后续请求时,浏览器通过以下请求头验证缓存:

  • If-Modified-Since: [Last-Modified值]向服务器询问资源是否在指定时间后修改过。
  • If-None-androidMatch: [ETag值]向服务器验证资源的 ETag 是否变化。

若资源未修改,服务器返回 304 Not Modified,浏览器继续使用缓存;若已修改,返回新资源(状态码 200)。

5. 适用场景

频繁更新的资源(如 html 页面、动态 API 响应)。

三、关键区别

特性强缓存协商缓存
通信成本网络请求(直接读缓存)需发送请求验证缓存
响应状态码200 (from disk cache)304 Not Modified
优先级优先于协商缓存强缓存过期后触发
适用资源长期不变的静态资源频繁更新的动态资源

四、Nginx 最佳实践

1.混合使用两种缓存

location / {
    # 强缓存 1 小时,过期后启用协商缓存
    add_header Cache-Control "public, max-age=3600";
    etag on;
}

2.按文件类型区分策略

# 图片、字体等强缓存
location ~* \.(jpg|png|gif|woff2)$ {
    expires 1y;
    add_header Cache-Control "public, max-age=31536000";
}

# HTML 文件禁用强缓存(总是协商)
China编程location ~* \.html$ {
    add_header Cache-Control "no-cache, must-revalidate";
}

3.解决缓存更新问题

强缓存资源建议通过 文件名哈希 控制版本(如 main.abcd1234.js)。

协商缓存可通过修改 ETag 或 Last-Modified 触发更新。

五、调试工具

浏览器开发者工具(Network 标签):

  • 查看 200 (from disk cache)(强缓存)或 304 Not Modified(协商缓存)。
  • 检查请求头中的 Cache-ControlIf-Modified-SinceIf-None-Match

命令行工具:

curl -I http://example.com/resource.js

通过合理配置强缓存和协商缓存,可以显著提升网站性能,减少服务器负载。

到此这篇关于一文详解Nginx的强缓存和协商缓存的文章就介绍到这了,更多相关Nginx缓存内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多编程China编程支持China编程(www.chinasem.cn)!

这篇关于一文详解Nginx的强缓存和协商缓存的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153679

相关文章

HTML5 搜索框Search Box详解

《HTML5搜索框SearchBox详解》HTML5的搜索框是一个强大的工具,能够有效提升用户体验,通过结合自动补全功能和适当的样式,可以创建出既美观又实用的搜索界面,这篇文章给大家介绍HTML5... html5 搜索框(Search Box)详解搜索框是一个用于输入查询内容的控件,通常用于网站或应用程

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF

CSS3中的字体及相关属性详解

《CSS3中的字体及相关属性详解》:本文主要介绍了CSS3中的字体及相关属性,详细内容请阅读本文,希望能对你有所帮助... 字体网页字体的三个来源:用户机器上安装的字体,放心使用。保存在第三方网站上的字体,例如Typekit和Google,可以link标签链接到你的页面上。保存在你自己Web服务器上的字

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

MyBatis ResultMap 的基本用法示例详解

《MyBatisResultMap的基本用法示例详解》在MyBatis中,resultMap用于定义数据库查询结果到Java对象属性的映射关系,本文给大家介绍MyBatisResultMap的基本... 目录MyBATis 中的 resultMap1. resultMap 的基本语法2. 简单的 resul

从基础到进阶详解Pandas时间数据处理指南

《从基础到进阶详解Pandas时间数据处理指南》Pandas构建了完整的时间数据处理生态,核心由四个基础类构成,Timestamp,DatetimeIndex,Period和Timedelta,下面我... 目录1. 时间数据类型与基础操作1.1 核心时间对象体系1.2 时间数据生成技巧2. 时间索引与数据

Mybatis Plus Join使用方法示例详解

《MybatisPlusJoin使用方法示例详解》:本文主要介绍MybatisPlusJoin使用方法示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录1、pom文件2、yaml配置文件3、分页插件4、示例代码:5、测试代码6、和PageHelper结合6

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务