动态响应不等于每次都必须回源。配置CDN动态内容缓存绕过条件与配置时,关键是判断响应能否由不同用户共享,以及哪些请求特征会改变内容。规则过宽会让缓存失效,过窄则可能把个性化结果发给错误用户。
以下五种规则适用于不同风险点。先明确绕过范围,再优化可共享内容的缓存键与有效期;不要只靠一条“动态路径不缓存”规则处理所有情况。
五种绕过规则:按请求差异选择
| 规则 | 适用情况 | 主要取舍 |
|---|---|---|
| 按请求方法 | 对写入或执行操作的方法绕过;通常只考虑缓存安全的 GET、HEAD 请求。 | 规则直观,但 GET 也可能返回用户专属内容,不能单独作为缓存依据。 |
| 按路径 | 将登录、账户设置、购物车等明确的个性化入口排除。 | 容易检查和维护;应用新增路径或改版后要同步更新,过宽匹配会损失命中。 |
| 按身份信息 | 请求带有登录凭证或会话 Cookie 时绕过,适合响应随用户身份变化的场景。 | 隔离风险较低;若所有请求都携带无关 Cookie,可能导致本可共享的页面也不命中。 |
| 按请求头 | 响应确实因语言、设备类别等请求头而变化时,将对应头纳入缓存键;无法安全区分时绕过。 | 粒度较细;纳入过多头部会增加缓存变体,降低命中率。留意源站的 Vary 设置。 |
| 按查询参数 | 对决定内容的参数区分缓存;对追踪类参数可在确认无业务影响后忽略或规范化。 | 保留必要参数能避免内容串用;参数组合过多会分散缓存,随意忽略则可能返回错误结果。 |
把绕过与命中优化分开处理
绕过规则回答“哪些请求不能共享”,缓存策略回答“哪些可共享响应能存多久”。例如 npm Registry 上公开的软件包元数据可供不同访问者读取;如果接口返回不含账户权限的公共信息,可评估短时共享缓存。私有包信息或带权限差异的响应则应按身份隔离,不能仅因路径相似而共用缓存。
先缩小缓存键,再设置时效
检查缓存键是否包含真正影响响应的主机名、路径和必要参数。确认追踪参数不会改变正文后,才考虑从缓存键中排除。随后按内容更新频率与可接受的陈旧时间设置有效期:短时变化内容可从几十秒起评估,更新不频繁的公开文件可采用更长时间;具体值须结合业务时效、源站更新方式和 CDN 配置验证。
利用验证请求减少重复传输
源站支持 ETag 或 Last-Modified 时,过期对象可通过条件请求确认是否变化;若未变化,通常无需重新传输完整正文。对短暂回源尖峰,可评估 stale-while-revalidate 等响应指令,但需确认 CDN 是否支持、规则是否覆盖,以及业务能否接受短暂旧内容。Cache-Control 中的 public、private、no-store 含义不同,不要把禁止存储与仅绕过边缘缓存混为一谈。

落地配置的检查顺序
- 按响应分类:区分公开且一致的内容、随参数变化的内容,以及依赖登录或权限的内容。
- 建立绕过条件:优先限制不适合共享的请求方法、敏感路径和身份凭证;再处理请求头与参数差异。
- 定义缓存键:只纳入影响响应的字段,检查忽略参数后是否可能混淆不同内容。
- 设置有效期与验证:为可共享响应设定合理时效;支持时使用验证器减少未变化对象的传输。
- 分场景验收:分别请求匿名、登录、不同参数及不同语言版本,检查响应正文、缓存状态和源站日志;发现串用立即收紧规则。
评估CDN动态内容缓存绕过条件与配置,不应只看命中率。命中率提升若伴随个性化内容错发,显然不可接受;应同时观察回源情况、响应正确性和更新延迟,并按风险逐步放开共享范围。
常见问题
动态页面能否缓存?
可以,前提是相同缓存键对应的用户得到相同内容,并且有效期符合时效要求。个性化响应应隔离或绕过。
带 Cookie 的请求是否一律绕过?
不一定。若 Cookie 与响应无关,可在验证后采用更精细的规则;若它决定身份或权限,应避免与匿名响应共用缓存。
查询参数都应加入缓存键吗?
不是。保留会改变响应的参数;对追踪参数,先确认源站不据此改变内容,再决定规范化或忽略。
怎样判断配置有效?
用不同身份、参数和请求头重复验证,结合 CDN 缓存状态与源站日志检查命中、回源及内容差异,而不是只看单一命中率。
最终,CDN动态内容缓存绕过条件与配置应以“先隔离敏感响应,再缓存可共享内容”为原则:五类绕过规则明确边界,缓存键、有效期和条件验证负责提升安全范围内的命中效率。


