缓存过期后先给旧内容再后台更新,这个缓存指令解决什么

📅 2026-10-11 👁️ 0

Cache-Control 里的 stale-while-revalidate 解决的是「用户不该为缓存回源校验等待」:按 MDN 文档,它是响应指令,允许缓存在过期后的窗口期内先复用旧的响应内容,同时在后台向源站重新校验,例子里的写法是 max-age=604800, stale-while-revalidate=86400——新鲜期一周,过期后还有一天窗口可以先给旧内容再更新。它和请求指令 max-stale 不是一回事:后者表达客户端愿意接受多旧的缓存,主流浏览器并不支持携带 max-stale 的请求。

新鲜期与过期期怎么划

max-age 定义响应的新鲜期,期内缓存可以直接命中,不打扰源站。超过新鲜期即进入过期期,默认行为是「先校验再返回」:缓存拿着标识回源确认,内容没变就续用,变了就取新——这一次回源的耗时全部计进用户等待。stale-while-revalidate 在过期期里开了一个窗口:窗口内的请求立刻拿到旧内容,缓存组件在背后异步完成校验,下一个请求拿到的就是新版。代价是窗口期内用户可能看到过期内容,窗口长度就是「快」与「新」之间的取舍参数。

后台更新把延迟藏在哪一段

被藏起来的是回源校验的往返时间。对首次进入过期期的请求,普通策略下用户要等一次完整校验;带该指令时用户拿到的是本地旧副本,校验在后台进行。它特别适合内容更新节奏以小时计、访问峰值又集中在缓存刚过期的场景——比如文章列表页在早高峰集中失效时,不会出现一整批「回源慢请求」。需要立即一致性的页面(支付、库存类)不适用,旧内容窗口就是错误信息窗口。

请求侧的旧内容容忍度支持如何

max-stale 属于请求指令,方向相反:由客户端声明「我最多能接受过期 N 秒的内容」。MDN 明确注明主流浏览器不支持发送带 max-stale 的请求,所以它的实际生效场景在程序化客户端、代理与缓存中间件之间,而不是浏览器地址栏。设计缓存策略时不要把希望寄托在浏览器会带上这个声明。

和 no-cache、must-revalidate 的分工

指令 位置 语义 典型用法
no-cache 响应 可存可复用,但每次复用前必须校验 变化频繁但要省流量的页面
must-revalidate 响应 过期后必须校验才能用,源站不可达时不得继续给旧内容 对一致性要求高的接口
stale-while-revalidate 响应 过期窗口内先用旧内容,后台校验 列表页、静态资源

must-revalidate 的态度是「宁可不返回也不返回过期的」,与 stale-while-revalidate 的「先给旧的再说」正好相反,两者按页面容忍度分开使用。

页面文档与静态资源要分开设

页面文档新鲜期设短,配一个分钟级的过期窗口即可兼顾体验与新度;带指纹的静态资源新鲜期设长,再叠一个短窗口兜底极端情况。缓存只是第一层提速:AnQiCMS 基于 Go 语言运行,页面加载速度相比传统 PHP 类 CMS 有显著提升,官方口径单机可承载约 500 万 PV——运行时开销低,回源校验本身也便宜,缓存参数因此可以设得更保守一些,不必为了护源站而拉长旧内容窗口。

常见问题

这个指令会影响搜索引擎抓取吗? 搜索引擎爬虫同样可能命中旧窗口内的内容,收录更新最多滞后一个窗口期。把窗口控制在分钟到小时级,对新内容曝光的影响很小。

浏览器不支持 max-stale,那响应侧指令还有效吗? 有效。stale-while-revalidate 与 must-revalidate 都是响应指令,由中间的 CDN、反向代理与浏览器缓存实现遵循,不依赖浏览器发请求时携带声明。

旧内容窗口里内容明明更新了为什么不生效? 这是设计行为:窗口内先给旧副本,后台校验完成后下一个请求才见新版。要求即时一致就把窗口设为零,改用先校验策略。

相关文章

政府门户和营销型官网选内容管理系统,看的能力项有什么不同

政府门户网站选内容管理系统优先看内容审核、敏感词过滤与用户组权限,营销型官网更看重关键词库、锚文本与表单的人机验证;robots配置与站点地图生成则是两类站点共用的底座。本文按约束差异拆开能力项,给出同一系统内两种配置取向,帮助按站点性质而不是按功能清单长短做选型。

2026-10-11

公式渲染模块被判跨站脚本,富文本过滤为什么要连渲染路径一起查

Drupal社区公告SA-CONTRIB-2026-195把MathJax模块的TeX渲染未转义JavaScript判为Critical跨站脚本,受影响版本低于4.1.2。富文本即使做了HTML标签白名单,公式、Markdown、图表等非HTML解析路径仍可能把数据当代码执行。本文说明如何读公告的版本区间与评级,并给出按输出上下文分别转义的自查清单。

2026-10-11

更新记录写的是上传扩展名黑名单没枚举全,靠黑名单挡上传为什么会漏

黑名单必须提前枚举所有恶意扩展名写法,新后缀变体、双重扩展名、大小写与编码变形都可能绕过不完整的枚举,同类系统PbootCMS的V3.2.16更新记录正记录了这类修复。本文给出扩展名白名单、内容类型核验与上传目录执行权限三层收口的做法,以及部署阶段要同步完成的一件事。

2026-10-11

统计说用 PHP 的网站约占七成,PHP 8 占其中约六成五,这两个数怎么用

W3Techs 2026年10月11日统计显示已知服务端语言的网站中69.7%使用PHP,PHP使用者中64.6%已在版本8。本文解释这两个数的口径与读法,并给出从生态、运行成本、部署形态与升级负担四项比较建站方案的框架,避免把部署占比直接当成技术结论。

2026-10-11

有论文指出生成式优化带来两类风险,内容站自查该看哪两处

有立场论文提醒,生成式引擎优化的风险落在引擎侧而非内容侧:一边是可见度更容易集中到少数来源,一边是未披露的商业影响可能混进证据与推理。站点能自查的是两处——谁在替你的页面说话,以及答案里有没有没交代的影响来源。

2026-10-11

公告把示例功能整段移除以修掉资源分配问题,生产站该留演示代码吗

Drupal公告SA-CONTRIB-2026-215的评级只是Less critical,处理方式却把邮件示例功能整个移除,因为示例存在没有上限的资源分配问题。生产站要不要保留演示代码,判断依据应是暴露面而不是风险评级。本文拆解示例代码带出的三类风险、部署阶段的清理清单,以及保留演示入口时的限制办法。

2026-10-11

图片处理库被列为攻击面,站点上传环节该收哪几道门禁

图片处理库在服务端解码用户上传的二进制内容,远程代码执行往往发生在解码器层而不是业务代码。PbootCMS在V3.2.22版本记录里把危险coder门禁、输入格式白名单与资源上限一起加入安全硬化,并修复了合法图片误判。本文按这三道门禁讲清站点上传环节该收的口子,以及收得太紧为什么会误伤正常图片。

2026-10-11

模板标签输出了脚本开标签,内容怎么会被当成代码执行

PbootCMS修复过站点标签输出脚本开标签的风险并增强了标签页参数过滤——当可编辑内容带着开标签进入模板引擎,数据就会被当成代码执行。本文解释数据变成代码的那一步发生在哪、标签输出位为什么要过滤、HTML、属性、脚本、URL四种上下文为什么要分别转义,以及越靠前的过滤越省事的分层收口。

2026-10-11