[{"data":1,"prerenderedAt":319},["ShallowReactive",2],{"blog-domain-migration-12-steps":3,"blog-prev-domain-migration-12-steps":149,"blog-next-domain-migration-12-steps":222},{"id":4,"title":5,"author":6,"body":7,"canonical":133,"category":134,"cover":133,"date":135,"description":136,"draft":137,"extension":138,"keywords":133,"meta":139,"navigation":140,"noindex":137,"ogImage":133,"path":141,"seo":142,"seoDescription":133,"seoTitle":133,"stem":143,"tags":144,"updated":133,"__hash__":148},"blog\u002Fblog\u002Fdomain-migration-12-steps.md","换域名的 12 步清单，少一步掉一批词","元析智能",{"type":8,"value":9,"toc":124},"minimark",[10,14,19,60,63,102,106,109,112,115,118,121],[11,12,13],"p",{},"换域名不是技术活，是项目管理活。技术部分两小时能做完，项目部分漏一项就要掉一个月的流量。下面是我们自己执行的 12 步，按时间顺序。",[15,16,18],"h2",{"id":17},"迁移前-4-周","迁移前 4 周",[20,21,22,30,36,42,48,54],"ol",{},[23,24,25,29],"li",{},[26,27,28],"strong",{},"盘点旧站流量","：GSC 和百度搜索资源平台导出近 90 天有点击的 URL，按点击排序，前 500 个是必须优先保住的。",[23,31,32,35],{},[26,33,34],{},"冻结改版","：迁移前后各两周不做内容改版、不改 URL 结构，两件事叠在一起，出问题分不清原因。",[23,37,38,41],{},[26,39,40],{},"建 301 映射表","：旧 URL 一列、新 URL 一列，逐条核对。没有这张表别上线。",[23,43,44,47],{},[26,45,46],{},"测试环境全量爬一遍","：Screaming Frog 爬新站，确认没有 404、没有循环重定向、没有 noindex 残留。",[23,49,50,53],{},[26,51,52],{},"确认基础设施","：新域名的 DNS、SSL 证书、CDN 配置、SPF 记录，提前一周准备好。",[23,55,56,59],{},[26,57,58],{},"通知相关方","：销售、客服、市场手里的旧链接清单，邮件签名、文档站、SDK 里的域名都要列出来。",[15,61,62],{"id":62},"上线当天",[20,64,66,72,78,84,90,96],{"start":65},7,[23,67,68,71],{},[26,69,70],{},"四个组合全做 301","：http 和 https、www 和非 www，四个变体都要跳到新域对应地址。2025 年 6 月一个 B2B 软件站只做了主域名，忘了 www 变体，两个域名同时在线三周，自然流量掉了 62%。",[23,73,74,77],{},[26,75,76],{},"sitemap 换新域名","，robots.txt 里的 Sitemap 声明同步改。",[23,79,80,83],{},[26,81,82],{},"站内绝对链接替换","，包括文档里的硬编码 URL 和邮件模板。",[23,85,86,89],{},[26,87,88],{},"两边资源都保留","：GSC 和百度搜索资源平台同时挂旧域和新域，旧域不要删，观察期至少三个月。",[23,91,92,95],{},[26,93,94],{},"提交改版","：GSC 有换域名的专用入口，百度用抓取诊断逐条验证新 URL 可抓。",[23,97,98,101],{},[26,99,100],{},"更新高权重外链","：能改的合作伙伴链接、目录、社区主页，一周内改完。",[15,103,105],{"id":104},"上线后-8-周","上线后 8 周",[11,107,108],{},"日志里看旧域名是否还有大量 404（说明漏了映射），收录曲线看新域是否在涨、旧域是否在退，排名监控看核心词有没有掉出前 20。前两周流量掉 10% 到 20% 是正常的，别急着回滚。那次掉 62% 的站，补完四个变体的 301 之后第 7 周恢复到原来的 9 成。",[15,110,111],{"id":111},"迁移后最容易漏的两件事",[11,113,114],{},"一是站内绝对链接。后台编辑器里存的内容，很多是硬编码的旧域名，换域名后文章里的图全部裂掉，蜘蛛抓到的也是坏链。上线后拿爬虫扫一遍全站图片和链接，能捞出几百条。",[11,116,117],{},"二是第三方资源。SDK 的默认域名、GitHub 上示例代码里的地址、App 里的接口域名。这些不在网站范围内，但用户和开发者会照着文档复制，旧域名一停服务就报错。",[15,119,120],{"id":120},"一句实话",[11,122,123],{},"迁移期间最容易犯的错是\"顺手优化一下\"。换个域名就别动目录结构，改完目录再改域名，出问题你会查两周。分两次做，每次只改一个变量。",{"title":125,"searchDepth":126,"depth":126,"links":127},"",2,[128,129,130,131,132],{"id":17,"depth":126,"text":18},{"id":62,"depth":126,"text":62},{"id":104,"depth":126,"text":105},{"id":111,"depth":126,"text":111},{"id":120,"depth":126,"text":120},null,"技术SEO","2025-11-25","域名迁移我们做过 9 次，最惨一次掉了 62% 的自然流量，原因是旧域名 301 只做了一半。这份 12 步清单按时间顺序排，从迁移前 4 周的准备到上线后 8 周的观察。",false,"md",{},true,"\u002Fblog\u002Fdomain-migration-12-steps",{"title":5,"description":136},"blog\u002Fdomain-migration-12-steps",[145,146,147],"网站迁移","域名",301,"HqMzkGNqGQHUfdqodZHUHklgrXZIpo7hOc7DvMAQOVA",{"id":150,"title":151,"author":6,"body":152,"canonical":133,"category":134,"cover":133,"date":211,"description":212,"draft":137,"extension":138,"keywords":133,"meta":213,"navigation":140,"noindex":137,"ogImage":133,"path":214,"seo":215,"seoDescription":133,"seoTitle":133,"stem":216,"tags":217,"updated":133,"__hash__":221},"blog\u002Fblog\u002Fai-generated-pages-indexing.md","AI 批量生成落地页，我们踩过的两个收录坑",{"type":8,"value":153,"toc":204},[154,157,161,164,167,171,174,177,180,183,186,189,192,195,198,201],[11,155,156],{},"2025 年 10 月我们给一个做 API 监控的服务批量生成了 180 个集成页，每个第三方服务一页。上线 6 周后 GSC 收录 41 页，其余全是已抓取未编入索引。这次踩的坑很典型，值得写下来。",[15,158,160],{"id":159},"坑一模板化太明显","坑一：模板化太明显",[11,162,163],{},"180 个页面，除了服务名，正文的措辞、段落结构、二级标题几乎一样。工具生成的时候看着每页都通顺，放到一起看就露馅了。搜索引擎判断重复不需要完全一致，结构相同、信息量相同就够它把你归到低质那堆里。",[11,165,166],{},"改法不是换同义词，是给每页补真差异。这个服务的接入步骤、它的接口和别家有什么不同、配置示例里实际要填哪几个字段、常见报错怎么处理。一页至少要有一段别处没有的内容，我们后来定的是每页 300 字左右的真差异，写不出来的页面直接删掉，不凑数。",[15,168,170],{"id":169},"坑二内链没有","坑二：内链没有",[11,172,173],{},"这 180 个页面只出现在站点地图里，从导航和产品文档都点不到。搜索引擎给它们的权重自然很低。我们后来加了一个集成目录页，按类别分组列出所有集成，再从产品文档的相关章节链过去，每页至少拿到 3 条内链。",[11,175,176],{},"内链加完第三周，收录从 41 涨到 96。不是全部，但趋势对了，剩下的页面继续等，同时补内容。",[15,178,179],{"id":179},"判断一页该不该生成",[11,181,182],{},"我总结了一个土办法：把服务名换掉，这段话还成立吗。成立，说明是模板废话，不该生成。不成立，说明里面确实有这个服务特有的东西，值得收。",[11,184,185],{},"另一种判断是看它能不能回答一个具体问题。用户搜“某服务监控怎么配”，这页能不能给出配置步骤和字段说明。答不了，就别指望它带来流量。",[15,187,188],{"id":188},"现在我们的做法",[11,190,191],{},"先做 10 页小样，两周后看收录率，低于五成就别放量，回头改模板。放量之后每页加软件类的结构化数据，把服务名、厂商、集成类型标清楚。GSC 里按目录单独建一个分组，只看这个目录的收录率和曝光，出了问题能第一时间发现。",[15,193,194],{"id":194},"一个反常识的观察",[11,196,197],{},"被收录的 41 页里，有 12 页是用户从搜索结果点进来过的。也就是说，先有人访问，收录才更稳。这跟很多人的理解反过来：不是收录了才有流量，有时候是有了流量才更容易被收录。所以小批量上线、然后想办法让页面被点到，比一次放 180 页更有效。",[11,199,200],{},"我们后来在一个页面上挂了首页的入口，两周后那页的抓取频次从每周 1 次变成每周 4 次，收录也跟着来了。这类信号搜索引擎是认的。",[11,202,203],{},"批量的诱惑在于看起来能一次做很多事，但搜索不吃数量这一套。180 页里有 96 页被收录，真正能带来注册的可能不到 20 页，剩下的投入其实白花。",{"title":125,"searchDepth":126,"depth":126,"links":205},[206,207,208,209,210],{"id":159,"depth":126,"text":160},{"id":169,"depth":126,"text":170},{"id":179,"depth":126,"text":179},{"id":188,"depth":126,"text":188},{"id":194,"depth":126,"text":194},"2025-11-24","180 个集成页上线 6 周，GSC 只收了 41 页。模板化太重、内链缺失，这两个坑让批量生成的内容白做。这篇写我们后来改的三处和放量前的验证法。",{},"\u002Fblog\u002Fai-generated-pages-indexing",{"title":151,"description":212},"blog\u002Fai-generated-pages-indexing",[218,219,220],"批量内容","收录","落地页","ggHgmqxlMRB9QQvZM7jAhiFUA0uM42PnCsyPjQOa3tM",{"id":223,"title":224,"author":6,"body":225,"canonical":133,"category":134,"cover":133,"date":308,"description":309,"draft":137,"extension":138,"keywords":133,"meta":310,"navigation":140,"noindex":137,"ogImage":133,"path":311,"seo":312,"seoDescription":133,"seoTitle":133,"stem":313,"tags":314,"updated":133,"__hash__":318},"blog\u002Fblog\u002Fcls-chat-widget-fix.md","客服组件把 CLS 顶到零点二八，我们最后是这么治的",{"type":8,"value":226,"toc":300},[227,230,233,236,239,242,246,249,252,256,259,262,265,268,271,274,277,288,291,294,297],[11,228,229],{},"今年 11 月我们接了一个 B2B SaaS 的移动端 CLS 问题，0.28，折腾了三个星期才压到 0.03。最后发现是两个\"看不见\"的组件在挪页面：cookie 同意条和客服窗口。",[11,231,232],{},"这类问题麻烦在于责任不清：开发觉得不是自己写的代码，市场觉得组件是现成的，谁都不认领。",[15,234,235],{"id":235},"症状和一次误判",[11,237,238],{},"GSC 报告里移动端 CLS 0.28，桌面端 0.06。Lighthouse 报的位移元素是 hero 下面那段介绍文字。前端第一反应是图片没尺寸，补了两张图的宽高，分数一动不动。",[11,240,241],{},"我们用 Performance 录了 10 次移动端加载，Experience 轨道上有三次明显位移，时间点都在 1.8 秒之后。这个时间点说明不是资源加载，是 JS 执行后插进来的东西。",[15,243,245],{"id":244},"真凶一cookie-同意条","真凶一：cookie 同意条",[11,247,248],{},"合规组件在 DOMContentLoaded 后往 body 顶部插了一条 64 像素高的同意条，整页下移。更糟的是它异步加载，有时 1.2 秒到，有时 2.6 秒到，Lighthouse 跑五次有两次抓不到。",[11,250,251],{},"改法：把同意条改成 fixed 定位放底部，不占文档流；或者在 HTML 里预留 64 像素占位。我们选 fixed，因为它本来就是临时提示，挡在底部比推开整页合理。",[15,253,255],{"id":254},"真凶二客服窗口","真凶二：客服窗口",[11,257,258],{},"客服组件打开时，它的 iframe 从 0 高度撑到 420 像素。窗口本身是 fixed，但它内部有个\"推荐问题\"列表是普通文档流，加载完把窗口里的标题顶下去。这部分位移照样被算进 CLS。",[11,260,261],{},"改法是给 iframe 容器写死高度加 overflow，内部列表自己滚动。改完客服窗口打开时页面纹丝不动。",[15,263,264],{"id":264},"结果和流程上的收获",[11,266,267],{},"三周后移动端 CLS 从 0.28 到 0.03，桌面端从 0.06 到 0.01。",[11,269,270],{},"比数字更有用的是一条规矩：任何第三方组件上线前，必须用移动端 4G 跑五次加载，看有没有位移。这条已经写进客户的验收清单，后面新接的客服系统也是这么过的。",[15,272,273],{"id":273},"一个可复用的检查办法",[11,275,276],{},"我们把这个流程做成了三步，客户自己也能跑：",[20,278,279,282,285],{},[23,280,281],{},"Chrome DevTools 打开移动端模拟、4G 加 4 倍 CPU 降速，连续刷新五次",[23,283,284],{},"每次录 Performance，只看 Experience 轨道上的 Layout Shift，记下位移元素和时间点",[23,286,287],{},"把时间点和网络面板里第三方脚本的加载时间对照，谁在后面就是谁",[11,289,290],{},"这个办法不依赖任何付费工具，前端和后端都能上手。真正难的是第五次才复现出来的那种问题——所以次数不能省，一次两次不够。",[15,292,293],{"id":293},"顺带修掉的一个坑",[11,295,296],{},"排查时我们还发现客服组件的脚本和 cookie 组件各自引入了同一份 polyfill，重复下载 34KB。换掉之后移动端 LCP 也顺带好了 0.2 秒。第三方组件的代价通常不止位移一项，趁着排查一起看。",[11,298,299],{},"如果你也在查 CLS，别只盯自己的代码。现在页面上一半的位移来自别人塞进来的东西，而且它们往往在页面\"看起来加载完了\"之后才动手。",{"title":125,"searchDepth":126,"depth":126,"links":301},[302,303,304,305,306,307],{"id":235,"depth":126,"text":235},{"id":244,"depth":126,"text":245},{"id":254,"depth":126,"text":255},{"id":264,"depth":126,"text":264},{"id":273,"depth":126,"text":273},{"id":293,"depth":126,"text":293},"2025-11-26","一个 B2B SaaS 移动端 CLS 0.28，补了图片宽高完全没用。真凶是 cookie 同意条和客服窗口两个第三方组件，三周压到 0.03，附上我们总结的第三方组件验收规矩。",{},"\u002Fblog\u002Fcls-chat-widget-fix",{"title":224,"description":309},"blog\u002Fcls-chat-widget-fix",[315,316,317],"CLS","第三方组件","客服系统","W48zf9rIvJk5HxzYTPpfwYADND4us8s3DSRSiEXHhss",1794088110557]