[{"data":1,"prerenderedAt":225},["ShallowReactive",2],{"blog-cdn-html-cache-rules":3,"blog-prev-cdn-html-cache-rules":109,"blog-next-cdn-html-cache-rules":90},{"id":4,"title":5,"author":6,"body":7,"canonical":90,"category":90,"cover":90,"date":90,"description":91,"draft":92,"extension":93,"keywords":90,"meta":94,"navigation":95,"noindex":92,"ogImage":90,"path":96,"seo":97,"seoDescription":90,"seoTitle":90,"stem":106,"tags":107,"updated":90,"__hash__":108},"blog\u002Fblog\u002Fcdn-html-cache-rules.md","营销页 HTML 该不该上 CDN 缓存，我们给了一条判断线","元析智能",{"type":8,"value":9,"toc":81},"minimark",[10,14,17,22,30,37,40,43,46,53,57,60,63,66,69,72,75,78],[11,12,13],"p",{},"营销页的 HTML 该不该上 CDN 缓存，我的答案是该，但要分页面类型。判断标准只有一条：这个页面的 HTML 是否因人而异。不会变的长缓存，会变的别碰。",[11,15,16],{},"去年 12 月我们给一个开发者工具站改缓存策略，TTFB 从 620 毫秒降到 140 毫秒，缓存命中率 87%。代价是一次事故：他们把一个带登录状态的页面也缓存了，22 分钟里有几十个用户看到别人的头像。这个错值得展开讲。",[18,19,21],"h2",{"id":20},"三类页面三套策略","三类页面，三套策略",[11,23,24,25,29],{},"营销页和博客：内容一周改一次，直接 ",[26,27,28],"code",{},"public, max-age=600, stale-while-revalidate=86400","，CDN 边缘 10 分钟，回源兜底。",[11,31,32,33,36],{},"定价页、功能页：同样是静态 HTML，但可能有 AB 测试和地区定价。我们用短缓存 60 秒，配合 ",[26,34,35],{},"Vary: Accept-Language","，AB 变体在客户端渲染，不进 HTML。",[11,38,39],{},"登录后的页面：不缓存。这类 HTML 里带着用户信息，任何形式的共享缓存都是风险，CDN 上直接 bypass。",[18,41,42],{"id":42},"判断线写清楚",[11,44,45],{},"我给客户的一句话：HTML 里只要出现用户名、头像、余额、token 中任意一个，就不许缓存。前端容易忽略的是 SSR 会把初始状态序列化进 HTML，那段 JSON 就是用户数据，肉眼看不见但确实在。",[11,47,48,49,52],{},"另一个高频坑是 ",[26,50,51],{},"Vary: Cookie","。它的意思是 cookie 不同就算不同缓存，可几乎所有请求都带 cookie，结果命中率接近 0，还多一层缓存 key 计算。我们的做法是把缓存策略绑在路径上，不绑 cookie。",[18,54,56],{"id":55},"缓存-key-怎么设计","缓存 key 怎么设计",[11,58,59],{},"CDN 的缓存 key 决定命中率。默认 key 是 host 加路径，这个配置对营销站基本够用。一旦你把语言、设备、AB 分组的参数加进 key，命中率会掉得很快。",[11,61,62],{},"我们的原则是 key 里只放\"真正改变 HTML 内容\"的维度。页面上有个\"登录\"和\"免费试用\"按钮的不同，不值得进 key，用 CSS 或者客户端判断就行。一个客户的 key 里放了 6 个参数，命中率只有 31%，砍到 2 个之后升到 88%。",[11,64,65],{},"顺带说下预热。大促或者投放前，把主要落地页主动推一遍 CDN，别等第一个用户来触发回源。",[18,67,68],{"id":68},"灰度发布和缓存",[11,70,71],{},"改版期间别忘了清缓存。我们接手的一个站，改版后三天用户还在看旧页面，因为 CDN 没刷、浏览器缓存 7 天也没动。后来定了规矩：HTML 缓存不超过 10 分钟，发版用带版本号的路径或者主动刷节点。",[18,73,74],{"id":74},"一笔成本账",[11,76,77],{},"这套策略不需要买更贵的 CDN 套餐，只需要把规则写对。营销站做完这一层，TTFB 通常降 60% 到 75%，服务器回源请求少八成。比换机房便宜得多，也比优化代码快得多。",[11,79,80],{},"唯一要提醒的是别一步到位。先把博客和营销页放上去看两周，确认没问题再动定价页。缓存这种事，出错的代价比省下的时间大。",{"title":82,"searchDepth":83,"depth":83,"links":84},"",2,[85,86,87,88,89],{"id":20,"depth":83,"text":21},{"id":42,"depth":83,"text":42},{"id":55,"depth":83,"text":56},{"id":68,"depth":83,"text":68},{"id":74,"depth":83,"text":74},null,"[object Object]",false,"md",{},true,"\u002Fblog\u002Fcdn-html-cache-rules",{"title":5,"description":98},{"判断标准只有一条：HTML 是否因人而异。营销页和博客长缓存、定价页短缓存、登录后页面不缓存。附一次缓存串号的 22 分钟事故和 Vary":99,"date":100,"category":101,"tags":102,"author":6,"draft":92},"Cookie 的坑。","2025-12-24","技术SEO",[103,104,105],"CDN缓存","TTFB","HTTP缓存","blog\u002Fcdn-html-cache-rules",[],"b_vhbJqLACSbOHmB_6VYhME65UzcpwE8YXD_ixXlqcs",{"id":110,"title":111,"author":6,"body":112,"canonical":90,"category":213,"cover":90,"date":214,"description":215,"draft":92,"extension":93,"keywords":90,"meta":216,"navigation":95,"noindex":92,"ogImage":90,"path":217,"seo":218,"seoDescription":90,"seoTitle":90,"stem":219,"tags":220,"updated":90,"__hash__":224},"blog\u002Fblog\u002Fcitation-click-landing.md","被 AI 引用之后，用户点进来落在哪一页",{"type":8,"value":113,"toc":204},[114,117,120,123,126,129,132,135,138,141,145,148,151,154,158,161,164,167,171,174,177,180,183,186,189,192,195,198,201],[11,115,116],{},"2026 年 11 月我们查一个客户的 AI 引用数据，发现有内容的页面被引用最多，但那些页面的留资几乎为零。引用带来了访问，访问走到了死路。",[18,118,119],{"id":119},"引用点击会落在哪",[11,121,122],{},"大部分情况落在被引用的那个页面，因为用户点的是答案里的来源链接。",[11,124,125],{},"少数情况用户不会点，而是看完回答直接搜品牌名。这部分流量会被记成品牌词搜索或直接访问。",[11,127,128],{},"两种情况都要求被引用页面本身能承接。",[18,130,131],{"id":131},"承接断在哪",[11,133,134],{},"被引用的页面通常是文档、博客、术语解释，这类页面的设计目标是讲清楚一个问题，不是促成转化。",[11,136,137],{},"于是出现一个断点：用户读完，觉得有用，但不知道下一步做什么。",[11,139,140],{},"页面上没有入口、没有相关产品、没有更多资料，用户就走了。",[18,142,144],{"id":143},"第一步找到被引用的页面","第一步：找到被引用的页面",[11,146,147],{},"从引用记录里整理页面清单，按被引用次数排序。",[11,149,150],{},"再和流量数据交叉，看这些页面实际有多少访问。",[11,152,153],{},"两个数据都靠前的页面，优先改。",[18,155,157],{"id":156},"第二步加一个不打扰的下一步","第二步：加一个不打扰的下一步",[11,159,160],{},"在文章末尾加一句，指向更详细的内容或者试用入口，比如\"想看完整的配置步骤，这里有文档\"。",[11,162,163],{},"在正文中间插一个轻量入口，比如\"这一节涉及的具体参数，我们的产品页有完整列表\"。",[11,165,166],{},"不要弹窗，不要遮内容。被引用页面的读者是来找答案的，打扰就流失。",[18,168,170],{"id":169},"第三步别把文档页改成销售页","第三步：别把文档页改成销售页",[11,172,173],{},"这是最容易犯的错。看到文档页流量大，就往上加各种 CTA 和表单。",[11,175,176],{},"结果内容变得难读，引用减少，流量也没了。",[11,178,179],{},"我们的原则是内容主体不动，只在合适的节点加导航，加完之后自己读一遍，不别扭才算过。",[18,181,182],{"id":182},"怎么测量",[11,184,185],{},"AI 引用的来源流量很难精确归因，因为很多引擎不传 referrer。",[11,187,188],{},"我们的做法是间接看三个数：被引用页面的总访问、这些页面的站内跳转率、品牌词搜索变化。",[11,190,191],{},"站内跳转率是最直接的指标。加了下一步之后，从文档页跳到产品页的比例应该上升。",[18,193,194],{"id":194},"一个态度",[11,196,197],{},"GEO 的终点不是被引用，是被引用之后有人愿意继续了解你。",[11,199,200],{},"引用是入口，承接是转化。只做引用不做承接，等于把流量引到一个没有门的房间。",[11,202,203],{},"这件事的投入很小，改几个页面的末尾就行。但它决定了 GEO 的投入能不能变成生意。",{"title":82,"searchDepth":83,"depth":83,"links":205},[206,207,208,209,210,211,212],{"id":119,"depth":83,"text":119},{"id":131,"depth":83,"text":131},{"id":143,"depth":83,"text":144},{"id":156,"depth":83,"text":157},{"id":169,"depth":83,"text":170},{"id":182,"depth":83,"text":182},{"id":194,"depth":83,"text":194},"SEO","2026-11-07","引用带来的点击通常落在被引用页面，而那一页往往没有转化入口。这篇写承接断在哪、怎么在不打扰阅读的前提下加下一步，以及怎么测量。",{},"\u002Fblog\u002Fcitation-click-landing",{"title":111,"description":215},"blog\u002Fcitation-click-landing",[221,222,223],"GEO","转化路径","落地页","59VysvmXMIaHC1faOdEZ615TAhHXhzDH2Ig14Ey9ZV4",1794088112712]