浏览器是怎么记住你刚看过的网页的
你在手机上刷电商网站,点进一个商品页,再退回去,再点进来——第二次加载明显快了不少。这不是错觉,而是HTTP请求中的缓存机制在背后干活。
简单说,缓存就是让浏览器“记一下”之前拿到的数据,下次用的时候先看看能不能直接用旧的,省得重新下载。这不仅能加快页面打开速度,还能减轻服务器压力,节省流量。
缓存从哪来?靠的是HTTP头
服务器在返回网页资源时,会附带一些“说明”,也就是响应头(Response Headers),里面就包含了要不要缓存、能缓存多久的信息。
比如最常见的两个字段:Cache-Control 和 Expires。现代做法主要用 Cache-Control,它更灵活。
Cache-Control: max-age=3600这行的意思是:这个资源可以缓存1小时(3600秒)。在这期间,浏览器再次请求它时,不会真的发网络请求,而是直接从本地拿。
那什么时候还会去问服务器?
就算资源在缓存有效期里,用户如果手动刷新页面,浏览器通常会发起一个“条件请求”,带上上次收到的标识,比如 Last-Modified 或 ETag。
服务器收到后,对比一下资源有没有变。如果没变,就回个 304 Not Modified,告诉浏览器:“放心用缓存里的”。这样一来,数据不用重传,省了带宽,速度也快。
If-None-Match: "abc123"这是浏览器发送的请求头,询问服务器 ETag 为 abc123 的资源是否还有效。如果匹配,服务器返回 304;不匹配,才返回新的资源和 200 状态码。
开发中常见的缓存策略设置
前端打包时,静态资源如 JS、CSS 文件常加上哈希值:app.abc123.js。这样可以让缓存时间设得很长,比如一年:
Cache-Control: max-age=31536000, immutable因为文件名变了就意味着新资源,旧缓存自然失效。而 HTML 文件通常不设长缓存,避免用户看不到更新。
缓存也不是万能的
有时候你改了样式,刷新页面却看不到效果,大概率是浏览器用了旧的 CSS 缓存。这时候可以强制刷新(Ctrl + F5),或者开发者工具里勾选“禁用缓存”。
另外,像登录状态、购物车这类动态数据,肯定不能随便缓存。接口设计时要明确标出哪些不能缓存:
Cache-Control: no-cache, no-store前者表示使用前必须校验,后者是干脆别存。
理解HTTP缓存机制,不只是程序员的事。普通用户能更好理解为什么有些页面快、有些刷新无效;开发者则能优化性能,减少服务器开销。说到底,缓存就像你家楼下的便利店——常用的东西放近处,随取随用,日子自然过得更顺。”,"seo_title":"HTTP请求中缓存机制详解 - 实用百科通","seo_description":"了解HTTP请求中的缓存机制如何提升网页加载速度,通过Cache-Control、ETag等头部实现高效资源管理,适用于前端开发与日常使用场景。","keywords":"HTTP缓存,缓存机制,Cache-Control,ETag,浏览器缓存,HTTP请求头,前端性能优化"}