[{"data":1,"prerenderedAt":313},["ShallowReactive",2],{"blog-hreflang-pipeline-validation":3,"blog-prev-hreflang-pipeline-validation":113,"blog-next-hreflang-pipeline-validation":216},{"id":4,"title":5,"author":6,"body":7,"canonical":97,"category":98,"cover":97,"date":99,"description":100,"draft":101,"extension":102,"keywords":97,"meta":103,"navigation":104,"noindex":101,"ogImage":97,"path":105,"seo":106,"seoDescription":97,"seoTitle":97,"stem":107,"tags":108,"updated":97,"__hash__":112},"blog\u002Fblog\u002Fhreflang-pipeline-validation.md","多语言站 hreflang 落地：从生成到校验的流程","元析智能",{"type":8,"value":9,"toc":85},"minimark",[10,14,18,21,24,27,30,43,51,55,58,61,64,67,70,73,76,79,82],[11,12,13],"p",{},"hreflang 要工程化，别靠人工。页面超过 200 个，手写一定漏，而且漏了不会报错。我们现在的做法是生成器加校验脚本，接进发布流程，漏了就不让上线。",[15,16,17],"h2",{"id":17},"三种实现位置",[11,19,20],{},"HTML head 里的 link 标签、HTTP 响应头、sitemap 里的 xhtml:link。我们统一用 HTML head 加 sitemap 双写，两处必须一致，冲突时以 HTML 为准。非 HTML 资源（PDF 白皮书之类）才用响应头。",[15,22,23],{"id":23},"生成器怎么设计",[11,25,26],{},"输入是页面 ID、语言、地区、这个页面有哪些翻译版本，输出是每个语言版本页面上的完整 link 标签组。数据来自内容库里的翻译关联表，不是从 URL 字符串猜。这点很重要：URL 规则一改，猜出来的关系就全错了。",[15,28,29],{"id":29},"三条校验规则",[31,32,33,37,40],"ol",{},[34,35,36],"li",{},"每个页面必须包含自身语言的 hreflang，自引用不能缺。",[34,38,39],{},"A 指向 B，B 必须指向 A，双向关系。",[34,41,42],{},"一个语言组里 x-default 有且只有一个。",[11,44,45,46,50],{},"再加两条容错：指向的 URL 必须返回 200 且不是 noindex；语言代码必须在合法列表里，",[47,48,49],"code",{},"en-UK"," 这种拼错要拦住。",[15,52,54],{"id":53},"_2025-年-11-月那次接入","2025 年 11 月那次接入",[11,56,57],{},"一个出海 SaaS，14 个语言、8000 个翻译页面。原来人工维护 sitemap 里的 hreflang，抽查发现漏了 23%。接入生成器后，校验脚本全量跑一遍 8 分钟，一次通过；新增语言版本的上线时间从两天缩到半天。",[15,59,60],{"id":60},"发布流程",[11,62,63],{},"语言版本上线，生成器写入 hreflang，校验脚本跑，通过才允许发布。失败时输出具体页面和缺失的语言，直接给到开发。这套流程跑了一年多，没再出现过整组失效的问题。",[15,65,66],{"id":66},"校验脚本长什么样",[11,68,69],{},"输入是爬虫导出的全站 HTML，输出是三张表：缺自引用的页面、单向指向的页面、语言组合法但 URL 异常的页面。用 Python 加正则就能写，一百行以内。我们把它做成 CI 里的一步，每次构建失败会直接指出哪个页面、缺哪个语言，不用人去翻源码。",[15,71,72],{"id":72},"什么时候不值得做",[11,74,75],{},"只有两三个语言版本、每个版本页面不多的站，别上这套工程。HTML head 里手写一组 link 标签就够，维护成本比写脚本低。语言版本超过 5 个、或者翻译页面超过 500 个，再考虑生成器。",[11,77,78],{},"还有一个判断：如果某个语言版本的内容只是机翻、没有本地化，先把内容补齐再谈 hreflang。语言组里塞一堆机翻页，搜索引擎会整组降低信任，比不配更糟。",[15,80,81],{"id":81},"立场",[11,83,84],{},"没有校验脚本的 hreflang 等于没有 hreflang。配错了搜索引擎不会提醒你，只会安静地展示错的语言版本，然后你以为是内容问题。",{"title":86,"searchDepth":87,"depth":87,"links":88},"",2,[89,90,91,92,93,94,95,96],{"id":17,"depth":87,"text":17},{"id":23,"depth":87,"text":23},{"id":29,"depth":87,"text":29},{"id":53,"depth":87,"text":54},{"id":60,"depth":87,"text":60},{"id":66,"depth":87,"text":66},{"id":72,"depth":87,"text":72},{"id":81,"depth":87,"text":81},null,"技术SEO","2026-06-01","hreflang 难的不是语法，是上千个页面的一致性。我们把 hreflang 做成生成器加校验脚本，接进发布流程，新增语言版本不会再漏。这篇给具体做法和三条校验规则。",false,"md",{},true,"\u002Fblog\u002Fhreflang-pipeline-validation",{"title":5,"description":100},"blog\u002Fhreflang-pipeline-validation",[109,110,111],"hreflang","多语言","工程化","mIdVFHXIROXmsqQ4Qb7qxEDoOcsHGJZaKpRBm2Omoug",{"id":114,"title":115,"author":6,"body":116,"canonical":97,"category":204,"cover":97,"date":205,"description":206,"draft":101,"extension":102,"keywords":97,"meta":207,"navigation":104,"noindex":101,"ogImage":97,"path":208,"seo":209,"seoDescription":97,"seoTitle":97,"stem":210,"tags":211,"updated":97,"__hash__":215},"blog\u002Fblog\u002Fdiagnosis-conversion-path.md","诊断最容易漏的一块，是转化路径这一环",{"type":8,"value":117,"toc":196},[118,121,124,127,130,133,136,139,142,145,148,151,154,157,160,163,166,169,172,175,178,181,184,187,190,193],[11,119,120],{},"2026 年 6 月我们诊断一个 SaaS 站，技术没问题、收录正常、一批词排在前 20，但自然流量带来的留资一个月只有个位数。查到最后是转化路径的问题：40 个有自然流量的页面里，只有 3 个有明确的转化入口。",[15,122,123],{"id":123},"为什么会漏掉",[11,125,126],{},"因为大部分人查的是关键词和排名，看的是流量从哪来，很少看流量进来之后发生了什么。",[11,128,129],{},"GSC 只给曝光和点击，转化数据在 GA4 或者业务系统里。两边不在一个界面上，很容易只查一边。",[11,131,132],{},"还有一个原因：转化路径涉及产品、设计、开发，不属于 SEO 的职责范围。做 SEO 的人默认这块不归自己管。",[15,134,135],{"id":135},"怎么查",[11,137,138],{},"第一步，拉出有自然流量的落地页，按流量排序，取前 20 个。",[11,140,141],{},"第二步，逐个打开，问三个问题：这页有没有告诉用户下一步做什么、这个动作在不在首屏附近、点了之后要填几个字段。",[11,143,144],{},"第三步，在 GA4 里看这 20 个页面的转化事件，看哪些有、哪些完全没有埋点。",[11,146,147],{},"第四步，走一遍真实流程，用手机走，别用电脑。移动端的表单体验经常是灾难。",[11,149,150],{},"第五步，算一个数：自然流量到留资的转化率。软件行业通常低得超出预期，个位数很常见。",[15,152,153],{"id":153},"常见的四种断裂",[11,155,156],{},"页面没有 CTA。文档页、博客文章看完就结束了，没有“预约演示”或者“免费试用”的入口。",[11,158,159],{},"CTA 只在页面底部。文档页动辄几千字，用户看到一半想试用，得滚到底。",[11,161,162],{},"表单字段太多。要填公司名、职位、电话、需求描述，七项起步，填完意愿也没了。",[11,164,165],{},"移动端按钮被遮。浮层、cookie 提示、客服气泡叠在一起，按钮点不到。",[15,167,168],{"id":168},"修的顺序",[11,170,171],{},"先修流量最大的 3 个页面，别一次改 20 个。改完两周看数据，有效果再推广。",[11,173,174],{},"每次只改一个变量。先加 CTA，再看表单字段能不能减。两个一起改，出了效果也不知道是哪个起的作用。",[11,176,177],{},"还有个低成本动作：在文章中间插一个轻量的转化入口，比如“想看完整的配置示例，留个邮箱”。这类软入口的转化率往往比底部按钮高。",[15,179,180],{"id":180},"转化路径要定期复查",[11,182,183],{},"上线不是结束。产品改版、表单换工具、CTA 位置调整，都会让路径断掉。我们每季度用同样的五个步骤查一次，成本一小时。",[11,185,186],{},"上个月复查发现一个页面的表单被开发临时下线，三周没人发现。这种事不会自己暴露，只能靠定期查。",[15,188,189],{"id":189},"我的立场",[11,191,192],{},"不做转化路径诊断的 SEO，等于只做了一半。排名上去了、流量进来了、用户走了，客户最后还是觉得没效果。",[11,194,195],{},"我们现在的诊断报告固定有一页讲转化，哪怕客户没要求。这一页经常是客户第一次意识到问题不在 SEO 而在承接页。",{"title":86,"searchDepth":87,"depth":87,"links":197},[198,199,200,201,202,203],{"id":123,"depth":87,"text":123},{"id":135,"depth":87,"text":135},{"id":153,"depth":87,"text":153},{"id":168,"depth":87,"text":168},{"id":180,"depth":87,"text":180},{"id":189,"depth":87,"text":189},"SEO","2026-05-31","40 个有自然流量的页面，只有 3 个有明确的转化入口。技术、收录、排名都查完了，流量进来了却没人留资，问题往往在这里，我们怎么查、先修哪几页都写在这。",{},"\u002Fblog\u002Fdiagnosis-conversion-path",{"title":115,"description":206},"blog\u002Fdiagnosis-conversion-path",[212,213,214],"转化路径","站点诊断","落地页","dboMYkLSNSLFFkp575UnOIOKWIM83bFxrsf-UwZoCjw",{"id":217,"title":218,"author":6,"body":219,"canonical":97,"category":98,"cover":97,"date":302,"description":303,"draft":101,"extension":102,"keywords":97,"meta":304,"navigation":104,"noindex":101,"ogImage":97,"path":305,"seo":306,"seoDescription":97,"seoTitle":97,"stem":307,"tags":308,"updated":97,"__hash__":312},"blog\u002Fblog\u002Fpagination-seo-rules.md","rel=next 没用了之后，分页页面怎么做技术 SEO",{"type":8,"value":220,"toc":294},[221,224,228,231,234,237,240,243,246,249,252,255,258,261,264,267,270,273,276,279,282,285,288,291],[11,222,223],{},"Google 早就不把 rel=next\u002Fprev 当收录信号，很多站的分页配置还停在五年前。2026 年 4 月我们给 8 个内容站重做了分页逻辑，核心是三件事：可抓取、有上限、尾部别急着 noindex。",[15,225,227],{"id":226},"rel-nextprev-的现状","rel next\u002Fprev 的现状",[11,229,230],{},"Google 2019 年就宣布不再把 rel=next\u002Fprev 当作索引信号。它现在只是把分页页当成普通页面处理，靠链接发现后续页。",[11,232,233],{},"百度对 rel=next\u002Fprev 的支持也有限，更多还是看页面之间的链接关系。",[11,235,236],{},"所以配置分页时，别把精力花在加标签上，把精力花在\"链接能不能被爬到\"上。",[15,238,239],{"id":239},"分页的三个目标",[11,241,242],{},"第一，让搜索引擎能发现深层的列表内容。第二页之后的条目，如果没有链接路径，等于不存在。",[11,244,245],{},"第二，别让分页页占满索引。一个 100 页的分页列表，前 5 页有价值，后面 95 页是重复内容。",[11,247,248],{},"第三，别让分页吃抓取预算。我们见过一个站，抓取请求的 30% 落在 page=20 之后的空列表上。",[15,250,251],{"id":251},"我们的做法",[11,253,254],{},"第一，分页链接用普通的 a 标签，href 指向真实 URL，别用 JS 点击加载。这是最基本的，但很多站做不到。",[11,256,257],{},"第二，给分页设上限。列表超过 10 页的，只保留前 10 页可抓取，后面的页面返回 404 或者用 robots 屏蔽。具体留几页，看内容量和用户行为，我们一般按\"前 3 页有点击\"来定。",[11,259,260],{},"第三，分页页的标题加页码，描述别复制第一页。重复的标题和描述会让搜索引擎判定为重复页。",[11,262,263],{},"第四，canonical 指向自己，不要指向第一页。分页页是独立页面，canonical 到第一页等于告诉搜索引擎\"这些都是第一页\"，深层内容就废了。",[15,265,266],{"id":266},"一个反常识的做法",[11,268,269],{},"很多教程说\"分页页全部 noindex\"。我们不同意。",[11,271,272],{},"分页页是发现深层内容的路径，noindex 之后，搜索引擎虽然还能顺着链接爬，但优先级会降低。我们的做法是：前几页保留 index，尾部页面才处理。",[11,274,275],{},"一个内容站按这个做法调整后，第 4 页之后的文章收录率从 22% 涨到 61%。",[15,277,278],{"id":278},"一个案例",[11,280,281],{},"一个做行业资讯的客户，列表页有 60 多页，之前每页都加 noindex。结果第 10 页之后的文章基本不收录。",[11,283,284],{},"我们改成：前 5 页 index，第 6 页之后 noindex 但保留链接，同时把所有文章的发布时间和分类归档页补上。两个月后，老文章收录量涨了 3 倍。",[15,286,287],{"id":287},"判断",[11,289,290],{},"分页不是\"要不要收录\"的二选一，是分层处理：头部页面给权重，尾部页面给路径。",[11,292,293],{},"别抄五年前的教程，先看你的分页现在到底被爬了多少、被收了多少，再决定怎么改。",{"title":86,"searchDepth":87,"depth":87,"links":295},[296,297,298,299,300,301],{"id":226,"depth":87,"text":227},{"id":239,"depth":87,"text":239},{"id":251,"depth":87,"text":251},{"id":266,"depth":87,"text":266},{"id":278,"depth":87,"text":278},{"id":287,"depth":87,"text":287},"2026-06-02","Google 早就不把 rel=next\u002Fprev 当收录信号，很多站的分页配置还停在五年前。2026 年 4 月我们给 8 个内容站重做了分页逻辑：可抓取、有上限、尾部不 noindex。三个目标、具体做法和一个反常识结论都在这篇。这套做法我们用了两年，8 个站都跑通了。",{},"\u002Fblog\u002Fpagination-seo-rules",{"title":218,"description":303},"blog\u002Fpagination-seo-rules",[309,310,311],"分页","抓取","站点结构","0ivLfnbd3p5hGJAF0MUWc97e4LSMe0LxC58RnTb6p44",1794088105132]