news 2026/6/4 23:50:19

HTTP 缓存详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HTTP 缓存详解

HTTP缓存是提升Web性能的关键技术,通过将资源保存在客户端或代理服务器上,减少重复请求。


核心机制分为强缓存(直接使用本地副本)和协商缓存(需服务器验证),通过Expires、Cache-Control、ETag等头部字段控制。


最佳实践包括:

  • 为静态资源添加哈希指纹实现长缓存;
  • HTML文件设置no-cache确保及时更新;
  • 敏感数据使用no-store避免缓存;

合理配置缓存策略能显著提升加载速度、节省带宽并降低服务器压力。


HTTP缓存详解

HTTP缓存是Web性能优化的核心技术之一,能显著减少网络延迟、节省带宽并降低服务器负载。下面我将从核心概念、工作机制、关键头字段、缓存策略等方面进行详解。


一、核心概念

HTTP缓存的核心思想是:将请求过的资源(如HTML、CSS、JS、图片)保存在客户端(浏览器)或中间的代理服务器上,当再次需要相同资源时,可以直接从本地或代理获取,而无需重新从源服务器下载。

主要好处:

  1. 加快页面加载速度,提升用户体验。

  2. 减少网络流量,为用户节省带宽。

  3. 降低服务器压力,提高服务能力。


二、缓存位置

  1. 私有缓存:通常是浏览器自身的缓存,只为单个用户服务。

  2. 共享缓存:位于客户端和服务器之间,为多个用户服务。

    • 代理缓存:如公司网络中的缓存代理。

    • CDN缓存:内容分发网络中的边缘节点缓存。


三、关键HTTP头部字段

缓存行为主要由HTTP请求和响应的头部字段控制。


1. 强缓存验证字段(无需向服务器发起请求)

浏览器直接判断是否使用本地缓存,不发送请求到服务器。

  • Expires(HTTP/1.0)

    • 值是一个绝对的过期时间(GMT格式)。

    • 缺点:依赖客户端时间,如果时间不同步会导致缓存失效不准。

  • Cache-Control(HTTP/1.1)

    • 优先级高于Expires

    • 常用指令:

      • max-age=:资源的最大存活时间(秒),从请求开始计算。例如max-age=31536000表示一年。

      • public:响应可以被任何对象(客户端、代理服务器)缓存。

      • private:响应只能被单个用户的浏览器缓存,不允许代理服务器缓存。

      • no-cache不是不缓存,而是使用缓存前必须向服务器验证(即进入协商缓存流程)。

      • no-store:真正的不缓存,不存储任何客户端或代理的缓存。用于敏感数据。

      • s-maxage:覆盖max-age,但仅适用于共享缓存(如CDN)。


2. 协商缓存验证字段(需要与服务器通信验证)

当强缓存失效或设置了no-cache时,浏览器会携带验证字段向服务器发起请求。服务器根据这些字段判断资源是否变更。

  • Last-Modified/If-Modified-Since

    • 服务器在响应头中返回Last-Modified,表示资源的最后修改时间。

    • 浏览器再次请求时,在请求头中带上If-Modified-Since,值为之前收到的Last-Modified

    • 服务器比较时间,如果未修改,则返回304 Not Modified(空Body);如果已修改,则返回200 OK和新资源。

    • 缺点:精度到秒,一秒内的修改无法感知;文件可能只是被touch修改了时间但内容未变。

  • ETag/If-None-Match

    • 优先级高于Last-Modified

    • 服务器在响应头中返回ETag,通常是文件内容的哈希值或版本号(如"33a64df551425fcc55e4d42a148795d9f25f89d4")。

    • 浏览器再次请求时,在请求头中带上If-None-Match,值为之前收到的ETag

    • 服务器比较ETag,如果一致则返回304,不一致则返回200和新资源。

    • 优点:能精确感知内容变化。缺点:计算ETag有服务器性能开销。


四、缓存工作流程(核心)

下图清晰地展示了浏览器处理HTTP缓存的完整决策过程:


简单来说,浏览器会优先检查强缓存,如果命中且未过期,则直接使用本地资源(极快)。否则,就会发起请求与服务器进行协商缓存验证,根据资源是否变化来决定是使用本地副本还是下载新资源。


五、常见的缓存策略模式

  1. 永久不变的文件(如打包后的带哈希指纹的app.a1b2c3.js

    Cache-Control: public, max-age=31536000, immutable
    • 设置长缓存(一年),immutable告诉浏览器即使用户刷新页面,也无需验证直接使用缓存。

  2. 经常变动的文件(如index.html

    Cache-Control: no-cache
    • max-age=0, must-revalidate

    • 每次都向服务器验证,确保获取最新的页面骨架。

  3. 用户隐私或敏感数据

    Cache-Control: private, no-cache
    • no-store(更严格)。

  4. 静态资源(无指纹)(如common.css

    Cache-Control: public, max-age=86400 ETag: "xyz123"
    • 设置一个较短的缓存时间(一天),配合ETag进行验证。


六、实践技巧与注意事项

  • 哈希指纹:为静态资源文件名添加内容哈希(如style.a1b2c3.css),这样一旦文件内容改变,文件名就变,相当于强制下载新文件。这是实现“长缓存”的最佳实践。

  • CDN缓存:注意Cache-Control头也会影响CDN行为。通常CDN会尊重源站的缓存头。

  • 用户行为影响

    • 正常打开:遵循上述缓存机制。

    • 回车刷新/跳转:浏览器会进行协商缓存验证。

    • 强制刷新(Ctrl+F5):浏览器会忽略所有缓存,请求头带上Cache-Control: no-cachePragma: no-cache,直接从服务器拉取。

    • 禁用缓存(开发者工具):所有请求都会绕过缓存。

  • Vary:用于告知缓存服务器,该资源的内容会根据某些请求头(如User-Agent,Accept-Encoding)的不同而改变。缓存服务器在决定是否使用缓存副本时,必须将这些请求头的值也作为判断依据。


总结

最佳实践组合:

  1. HTML文件:使用no-cache或较短的max-age,确保能及时更新。

  2. 带哈希的静态资源(CSS, JS, 图片):使用Cache-Control: max-age=31536000, immutable进行长缓存。

  3. API接口数据:通常使用Cache-Control: no-storeprivate, max-age=0,避免敏感数据被缓存。对于公开数据,可适当使用max-ageETag


理解并合理配置HTTP缓存,是构建高性能Web应用不可或缺的一环。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/28 17:53:25

PHP开源在线考试系统源码,多用户版,带完整的搭建部署教程

温馨提示:文末有资源获取方式寻找一个既有技术深度又具备商业潜力的创业项目?这款多用户在线答题考试小程序源码系统值得您的关注。它采用经典的PHPMySQL开发,源码交付,提供高度的自主定制空间,不仅是一个强大的工具&a…

作者头像 李华
网站建设 2026/6/1 20:28:49

Dify平台家居布置灵感生成器开发

Dify平台家居布置灵感生成器开发 在智能家居与个性化生活日益受到关注的今天,越来越多用户希望以低成本、高效率的方式获得专业级的家装设计建议。然而,传统室内设计服务往往价格高昂、周期漫长,且难以满足“快速试错、即时反馈”的现代消费习…

作者头像 李华
网站建设 2026/5/28 17:53:25

利用Dify镜像快速实现大模型应用落地的5个关键步骤

利用Dify镜像快速实现大模型应用落地的5个关键步骤 在企业纷纷寻求AI能力落地的今天,一个现实问题摆在面前:为什么拥有强大语言模型的企业,依然难以快速推出可用的智能应用?答案往往不在于模型本身,而在于工程化链条太…

作者头像 李华
网站建设 2026/5/30 15:41:02

从零构建AutoGLM系统,手把手教你打造类ChatGPT智能引擎

第一章:AutoGLM系统概述 AutoGLM 是一个面向通用语言模型自动化调优与任务适配的智能系统,旨在降低大模型应用门槛,提升从数据准备到模型部署的全流程效率。该系统融合了自动化提示工程、上下文学习优化、任务自适应推理和轻量化微调能力&…

作者头像 李华
网站建设 2026/5/29 23:06:59

52、搜索功能配置与自定义全解析

搜索功能配置与自定义全解析 在进行网站集的基本搜索设置配置后,接下来可着手自定义搜索范围的配置。搜索范围能创建索引的子集,使查询仅针对该子集进行。搜索范围可在两个不同级别创建:全局搜索范围和网站集搜索范围。全局搜索范围创建后,可被服务器场中的任何网站集使用…

作者头像 李华