营销页的 HTML 该不该上 CDN 缓存,我的答案是该,但要分页面类型。判断标准只有一条:这个页面的 HTML 是否因人而异。不会变的长缓存,会变的别碰。
去年 12 月我们给一个开发者工具站改缓存策略,TTFB 从 620 毫秒降到 140 毫秒,缓存命中率 87%。代价是一次事故:他们把一个带登录状态的页面也缓存了,22 分钟里有几十个用户看到别人的头像。这个错值得展开讲。
三类页面,三套策略
营销页和博客:内容一周改一次,直接 public, max-age=600, stale-while-revalidate=86400,CDN 边缘 10 分钟,回源兜底。
定价页、功能页:同样是静态 HTML,但可能有 AB 测试和地区定价。我们用短缓存 60 秒,配合 Vary: Accept-Language,AB 变体在客户端渲染,不进 HTML。
登录后的页面:不缓存。这类 HTML 里带着用户信息,任何形式的共享缓存都是风险,CDN 上直接 bypass。
判断线写清楚
我给客户的一句话:HTML 里只要出现用户名、头像、余额、token 中任意一个,就不许缓存。前端容易忽略的是 SSR 会把初始状态序列化进 HTML,那段 JSON 就是用户数据,肉眼看不见但确实在。
另一个高频坑是 Vary: Cookie。它的意思是 cookie 不同就算不同缓存,可几乎所有请求都带 cookie,结果命中率接近 0,还多一层缓存 key 计算。我们的做法是把缓存策略绑在路径上,不绑 cookie。
缓存 key 怎么设计
CDN 的缓存 key 决定命中率。默认 key 是 host 加路径,这个配置对营销站基本够用。一旦你把语言、设备、AB 分组的参数加进 key,命中率会掉得很快。
我们的原则是 key 里只放"真正改变 HTML 内容"的维度。页面上有个"登录"和"免费试用"按钮的不同,不值得进 key,用 CSS 或者客户端判断就行。一个客户的 key 里放了 6 个参数,命中率只有 31%,砍到 2 个之后升到 88%。
顺带说下预热。大促或者投放前,把主要落地页主动推一遍 CDN,别等第一个用户来触发回源。
灰度发布和缓存
改版期间别忘了清缓存。我们接手的一个站,改版后三天用户还在看旧页面,因为 CDN 没刷、浏览器缓存 7 天也没动。后来定了规矩:HTML 缓存不超过 10 分钟,发版用带版本号的路径或者主动刷节点。
一笔成本账
这套策略不需要买更贵的 CDN 套餐,只需要把规则写对。营销站做完这一层,TTFB 通常降 60% 到 75%,服务器回源请求少八成。比换机房便宜得多,也比优化代码快得多。
唯一要提醒的是别一步到位。先把博客和营销页放上去看两周,确认没问题再动定价页。缓存这种事,出错的代价比省下的时间大。
元析智能
为软件公司做 SEO 和 GEO 优化