三年没动过栏目结构的企业站:pillar-cluster 内链架构与站点层级改造实录
适用读者:接手老企业站的技术 SEO 从业者、负责官网改版的前端与全栈工程师、被「收录上不去」折磨的企业站站长。
上个月一位做了十几年机械制造的朋友给我看他们官网的 Google Search Console(GSC)后台,页面索引报告里一长串灰字:已抓取 - 未编入索引,604 个页面里占了 483 个。他第一反应是网站被 Google 惩罚了。我说恰恰相反,Google 对你这站抓得挺勤快,问题出在结构上——600 多个页面摊平在一个层级里,栏目之间互不链接,权重进站之后没有路可走。
这个站 2018 年找外包做的,中间只换过两次视觉稿,栏目结构三年没动过。8 月我开始帮他按 pillar-cluster(支柱-集群)模型做架构改造,8 周后索引率从 19% 拉到 72%,核心词进前 3 页的数量从 17 个涨到 39 个。这篇文章把整个改造拆开记录:改前怎么诊断、内链权重怎么量化、URL 怎么做 301 收敛,以及踩过的几个坑。
TL;DR 快速摘要
- 扁平结构致 71% 孤儿页:600 页摊平无互链,权重进站无路可走。
- pillar-cluster 改造见效:8 周索引率从 19% 升至 72%,核心词进前 3 页翻倍。
- URL 三层收敛 + 301:旧路径按栏目批量映射,权重完整转移不丢分。
- 内链审计脚本可复用:改造前后各跑一遍,CSV 直接当验收标准。
600 页扁平结构,问题到底出在哪
老周这个站(化名,下文都这么称呼)是典型的历史包袱型企业官网。市场部的人这些年断断续续往上传内容:产品页 300 多个,参数与图纸下载页 90 多个,新闻 180 多篇,客户案例 40 来篇。当年 CMS 图省事,所有页面全挂在根目录下,路径长这样:/product-cnc-vmc850.html、/news-2023-06-08.html。没有层级,没有栏目互链,侧边栏是全站统一的一排「产品中心 / 新闻动态 / 联系我们」,仅此而已。
我接手诊断时做了三件事,把问题钉死:
- 写了个小爬虫把全站 604 个页面扫了一遍,统计每页的站内入链数。71% 的页面入链数是 0,也就是孤儿页(Orphan Page),只能靠 sitemap.xml 和列表分页被 Google 发现。
- 看 GSC 抓取统计报告,新品页发布两周,抓取记录还是 0 次;整站日均抓取量平摊到 600 个页面上,每个页面几天才轮到一次。
- 拉 50 个核心词的排名快照,只有 17 个词进过前 3 页,而且全集中在首页和两个权重最高的老产品页上。
问题不在内容。老周的产品页参数写得很全,新闻也是市场部真人在更新,一年能出 60 多篇。坏在链接图:首页链到几个栏目列表页,列表页链到分页,翻到第 5 页之后基本就是死胡同;详情页之间互相不知道对方存在。Google 就算抓到了页面,也判断不出哪些页面重要,判断不出主题归属,索性大量挂着「已抓取 - 未编入索引」。
老周当时的原话是:「我这些页面单拎出来哪篇不比同行写得细,怎么就是不给排名?」这话其实答了:单独看每页都行,合在一起就是一盘散沙,搜索引擎没有理由相信这个站任何一块内容是权威的。
改造前诊断清单
动手改结构之前,先把现状量化钉死。下面这张表是我给老周做初诊时的完整动作,每一步都对应一个可复用的产出物,改造完成后还能拿来做验收对照:
| 步骤 | 所需工具 | 关键输出物 | 耗时预估 | 常见坑位 |
|---|---|---|---|---|
| 1. 全站 URL 清单导出 | sitemap.xml 解析脚本 / Screaming Frog | urls.txt(全站 604 个 URL) | 0.5~1 小时 | 别漏了 PDF、图片页等非 HTML 资源,后面爬虫会误判 |
| 2. 站内入链数统计 | Python + requests + BeautifulSoup(上文脚本) | inbound_report.csv(每页入链数) | 2~4 小时(含抓取限速) | 只统计<main>里的链接,导航和页脚会污染数据 |
| 3. 孤儿页识别 | 上一步 CSV 过滤inbound_links=0 | 孤儿页清单(老周站 71% 命中) | 复用上一步 | 别把「仅靠 sitemap 可发现」当成有入链,两者不是一回事 |
| 4. GSC 抓取统计核对 | Google Search Console → 抓取统计报告 | 抓取频率截图、未编入索引页面数 | 0.5 小时 | 数据有 2~3 天延迟,别拿当天数据下结论 |
| 5. 核心词排名快照 | GSC 效果报告 / 第三方排名工具 | 50 个核心词排名表(前 3 页数量) | 1~2 小时 | 排名快照要固定日期,改造前后对比才有意义 |
| 6. 跨栏目链接矩阵 | 上文脚本的cross_section输出 | 栏目间链接流向表(前 20 行) | 复用第 2 步 | 同栏目互链别计入,只看跨栏目的权重流向 |
| 7. 外部历史链接盘点 | 合作方沟通 + 印刷品/二维码/公众号文章排查 | 外部硬编码链接清单 | 2~4 小时 | 最容易漏的一步,301 正则映射兜不住所有历史路径 |
坑位提醒:第 2 步和第 6 步共用同一份抓取结果,跑一次脚本就能同时产出,别重复抓全站浪费时间。整份清单做完,改造前和改造后各跑一遍,差异就是你的工作量清单和验收标准。
内链权重分配的机制:PageRank 在站内怎么流动
改造前得把底层逻辑讲透。Google 官方 SEO 入门指南把链接描述成「投票」,一个页面收到的站内链接越多、来源页面本身越权威,它被评估为重要的概率就越高。这是 PageRank 在站内维度的直观表现:权重沿链接流动,每经过一层稀释一次;没有内链指向的页面,权重流动到不了,只能靠外部信号硬扛。
扁平结构的病根在于:604 个页面在链接图上几乎是对等节点,首页权重平摊出去,落到每个详情页头上只剩薄薄一层;详情页之间零互链,权重流到叶子节点就断头,没有回流、没有再分配。Google 的抓取调度器(crawler scheduler)也会参考站内链接结构决定抓取优先级,0 入链的孤儿页在抓取队列里天然排后面,索引速度自然起不来。
改造成 pillar-cluster 之后,链接图变成「星型 + 网状」的混合结构:支柱页(Pillar Page)承接栏目层的主要入链,集群页(Cluster Page)挂在支柱页下面,集群页之间横向互链。权重在簇内循环加强,再通过集群页指向支柱页的链接向上回流,形成有方向的权重循环。下面这张图是改造前后链接图的直观对比:
左半边的问题一眼能看出来:孤儿页悬在图外面,权重流不过去;右半边所有节点都挂在一条从首页出发的路径上,每个页面至少有一条站内入链。这就是后面索引率能提升近四倍的图论基础。
重组方案:6 个支柱页 + 48 个集群页
先做关键词聚类,再定支柱。老周的产品线是数控加工中心、液压冲压设备、钣金生产线三大块,客户问得最多的场景集中在汽车零部件和家电外壳两块,另外站里积压的选型指南类内容不少。据此定了 6 个支柱页:三个产品线支柱、两个行业解决方案支柱、一个选型知识支柱。支柱页不是普通栏目页,每页都有 1500 字以上的原创导览内容,把本主题下所有子话题串起来。
48 个集群页按「一个集群页吃透一个长尾意图」来拆:比如「立式加工中心选型」下面挂精度对比、主轴配置、典型加工节拍这些子题;原来散落的 90 多个参数下载页全部归到对应集群页下面,作为集群页的内嵌资源而不是独立页面。原来 300 多个产品详情页保留,但全部挂进对应集群的层级里。
内链规则是这次改造的核心,写成硬性约束让开发执行:
| 链接位置 | 指向目标 | 数量约束 | 目的 |
|---|---|---|---|
| 支柱页正文 | 本簇全部集群页 | 8~10 条上下文链接 | 集中分发权重 |
| 集群页正文 | 所属支柱页 | 2~3 条 | 权重回流 |
| 集群页之间 | 同簇相关集群页 | 2~4 条 | 簇内循环 |
| 详情页面包屑 | 上两级层级 | 固定 2 条 | 传递层级信号 |
| 详情页正文 | 同簇相关详情页 | 1~2 条 | 长尾互通 |
一个执行细节:上下文链接要出现在正文段落里,锚文本用描述性的词,不要做成正文底部一排「相关推荐」的机器拼接。Google 对模板化推荐位的链接加权一直很保守,正文里的编辑性链接(editorial link)信号强得多。
改造后的目标结构长这样,6 个支柱页各自带一簇集群页,详情页通过面包屑和正文链接挂回支柱:
URL 三层收敛与 301 映射
URL 层级和内容层级同步收敛,统一成三层:/products/cnc/vmc850/(栏目/子类/详情)、资讯归到/insights/2024/slug/。所有旧路径走 301 永久重定向,映射表按栏目批量生成,特例单独补。下表是映射规则的节选:
| 旧 URL 模式 | 新 URL 模式 | 数量 | 说明 |
|---|---|---|---|
| /product/cnc-*.html | /products/cnc/{slug}/ | 137 | 按产品线归入子类 |
| /product/press-*.html | /products/press/{slug}/ | 96 | 同上 |
| /news/2023-*.html | /insights/2023/{slug}/ | 61 | 新闻并入资讯集群 |
| /download/{file}.pdf | 保留原路径 | 92 | PDF 不重定向,挂进集群页 |
| /about.html 等散页 | /company/{slug}/ | 18 | 小批量人工核对 |
Nginx 侧用 map 指令做批量映射,比重写几百条 rewrite 规则清爽得多:
# 环境:Nginx 1.24;map 块放在 http{} 里,reload 前先 nginx -t 校验语法 # 旧 URL 按栏目批量映射到新三层结构,单条特例用单独 location 兜底 map $uri $new_uri { # 旧产品详情页 /product/cnc-xxx.html 收敛到 /products/cnc/xxx/ ~^/product/cnc-(?<slug>.+)\.html$ /products/cnc/$slug/; ~^/product/press-(?<slug>.+)\.html$ /products/press/$slug/; # 旧新闻页按年份并入新的资讯集群目录 ~^/news/2023-(?<slug>.+)\.html$ /insights/2023/$slug/; ~^/news/2024-(?<slug>.+)\.html$ /insights/2024/$slug/; # 没匹配上的旧路径一律回首页,避免 404 漏网 default /; } # 301 生效前先在本机 hosts 指向测试机,抽查 20 条旧路径的重定向响应头 server { listen 443 ssl; server_name www.example-machinery.com; # map 命中后 $new_uri 非空,走 301 永久重定向,权重完整转移 if ($new_uri) { return 301 https://www.example-machinery.com$new_uri; } # 未命中的请求交给新站点正常渲染 location / { proxy_pass http://127.0.0.1:8080; } }上线当天我在 GSC 提交了新的 sitemap,旧的提交记录没删,让两份对照观察。头一周旧 URL 的 301 命中率 99.2%,剩下 0.8% 是外部合作方硬编码的老链接,逐条补进了映射表。这里有个教训:改版前一定要把合作方、印刷品二维码、微信公众号历史文章里的外链路径扒出来过一遍,单靠正则映射兜不住所有历史路径。
内链审计:用脚本量化权重流向
架构改得对不对,不能靠感觉,得量化。我用了一个两层的审计口径:页面级的入链数(找孤儿页和权重洼地),栏目级的跨栏目链接矩阵(看权重流向是否符合设计)。脚本如下,改造前后各跑一遍,差异就是工作量清单:
# 依赖:Python 3.10+,requests、beautifulsoup4(pip install requests beautifulsoup4)# 环境:全站 URL 清单 urls.txt 来自 sitemap 解析,逐页拉取后输出 CSV 审计报告importcsvfromcollectionsimportdefaultdictfromurllib.parseimporturlparseimportrequestsfrombs4importBeautifulSoup# 站内全部 URL 清单,一行一个SITE_URLS=[u.strip()foruinopen("urls.txt",encoding="utf-8")ifu.strip()]# 取路径前两段作为「栏目键」,用于统计栏目间的链接流向defsection_key(url):parts=urlparse(url).path.strip("/").split("/")# 单段路径统一归入 home 层,方便统计首页之外的人造层级return"/".join(parts[:2])iflen(parts)>=2else"home"# 入链计数表:目标 URL -> 站内指向它的链接条数inbound=defaultdict(int)# 栏目间链接矩阵:(源栏目, 目标栏目) -> 次数,用来核对权重流向cross_section=defaultdict(int)forurlinSITE_URLS:try:# 逐页拉 HTML;生产环境建议加并发控制、UA 和超时重试html=requests.get(url,timeout=10).textexceptrequests.RequestException:# 抓取失败的页面跳过,失败清单最后单独输出排查continuesoup=BeautifulSoup(html,"html.parser")# 只统计正文 <main> 里的链接,导航、页脚另算,避免模板噪声main=soup.find("main")orsoup.bodyforainmain.find_all("a",href=True):href=a["href"].split("#")[0]# 过滤外链、伪协议与空锚点ifnothref.startswith("http"):continueifurlparse(href).netloc!=urlparse(url).netloc:continueinbound[href]+=1# 同栏目互链不进跨栏目矩阵,只关心跨栏目的流向ifsection_key(href)!=section_key(url):cross_section[(section_key(url),section_key(href))]+=1# 输出每个 URL 的入链数,0 入链的就是待处理的孤儿页withopen("inbound_report.csv","w",newline="",encoding="utf-8")asf:writer=csv.writer(f)writer.writerow(["url","inbound_links"])foruinSITE_URLS:writer.writerow([u,inbound.get(u,0)])# 打印跨栏目矩阵前 20 行,肉眼核对哪些栏目还是互不来往for(src,dst),ninsorted(cross_section.items(),key=lambdax:-x[1])[:20]:print(f"{src}->{dst}:{n}")改造前跑出来的结果和爬虫初诊一致:71% 的页面 0 入链,跨栏目矩阵里「新闻→产品」「案例→产品」两个方向全是 0,也就是说 8 年里新闻和案例从没给产品页递过一票。改造后第 4 周复跑:0 入链页面降到 12 个(全是还没挂完的老图纸页),「insights→products」方向单月新增了 260 多条上下文链接,支柱页的入链数是改前的 14 倍。这份 CSV 我后来直接当验收标准用,开发每挂一批内链就重跑一次。
8 周执行节奏与 GSC 数据对比
执行节奏比想象中平缓:第 1~2 周做关键词聚类和支柱页定稿;第 3~4 周上线新 URL 结构和 301,同时迁内容;第 5~6 周集中补内链,重点是集群页之间和 insights 到产品的上下文链接;第 7~8 周清理残留孤儿页、复跑审计、盯 GSC。中间在第 5 周踩过一个坑:批量替换模板时把面包屑的第二级写死成了栏目名,导致一批详情页的面包屑层级断了一级,复跑审计时跨栏目矩阵突然冒出几百条异常链接才发现,改回来之后数据才恢复正常。
GSC 里最有说服力的是索引报告和效果报告这两组数:
| 指标 | 改造前(第 0 周) | 第 4 周 | 第 8 周 |
|---|---|---|---|
| 已编入索引页面 | 115(19%) | 296(49%) | 435(72%) |
| 已抓取 - 未编入索引 | 483 | 240 | 108 |
| 核心词进前 3 页数量 | 17 | 26 | 39 |
| 详情页平均点击深度 | 5.2 | 3.1 | 2.4 |
| 日均抓取量(全站) | 约 210 次 | 约 480 次 | 约 870 次 |
几个数字值得放在一起看。索引率 19% 涨到 72%,但抓取量也翻了四倍左右——抓取调度器看到站内链接变密、层级变浅之后,主动提高了抓取预算(crawl budget),这是个正向循环:内链密 → 抓取勤 → 索引快 → 排名变动更快被发现。点击深度从 5.2 降到 2.4,意味着重要详情页离首页只隔两次点击,这是层级收敛最直接的收益。老周第 8 周在电话里的原话:「新闻页开始给产品页带流量了,以前那 180 篇新闻等于白写,现在等于埋了一堆管道。」
顺带说一下:这套架构对 GEO 的衔接价值
这次改造的主体是传统搜索引擎的收录与排名,但顺手为后续 GEO(生成式引擎优化,Generative Engine Optimization)铺了路。pillar-cluster 天然产出「一个主题一个权威聚合页」的结构,生成式引擎做检索增强时偏好摘取主题聚焦、层级清晰的页面;等后续要针对 AI 搜索做适配,只需要在集群页上补 FAQ 结构化数据和面向机器可读的内容组织,链接和层级这套地基不用再翻动。传统 SEO 是 1,GEO 是后面加的 0,顺序不能倒。
GEO 适配三步走
衔接价值说清楚了,落地动作拆成三步,每步都对应一个可复用的产出物,改造完传统 SEO 之后顺手就能做:
第一步:集群页加 FAQPage 结构化数据
生成式引擎做检索增强时,偏好直接摘取 FAQ 里的问答对作为答案素材。在集群页<head>里注入 JSON-LD,把页面覆盖的长尾问题逐条列出来:
{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"立式加工中心怎么选型?","acceptedAnswer":{"@type":"Answer","text":"先按工件材质和加工节拍定主轴转速与行程,再对比刀库容量和换刀时间,最后用典型零件试切验证刚性。"}},{"@type":"Question","name":"五轴加工和 3+2 定位加工的区别是什么?","acceptedAnswer":{"@type":"Answer","text":"五轴加工是联动切削,适合复杂曲面;3+2 定位是分度后三轴加工,适合斜面钻孔和铣面,成本更低。"}}]}坑位提醒:FAQ 的text字段要和页面正文里的答案逐字对应,别写页面里没有的内容,否则会被判为内容不一致。
第二步:支柱页写「核心结论」段落
生成式引擎摘取答案时,偏好页面开头一段能独立成文的结论。在支柱页正文第一段之后,加一段 50 字左右的「核心结论」,把本主题的答案前置:
核心结论:数控加工中心选型看三件事——工件材质定主轴、加工节拍定行程、预算定刀库配置;选型前先用典型零件做试切验证,比看参数表更可靠。
模板:核心结论:{主题}看三件事——{维度一}定{指标一}、{维度二}定{指标二}、{预算/场景}定{配置};{行动建议}。
第三步:详情页加「相关主题」模块
详情页底部加一个「相关主题」模块,指向同簇的 3~5 个页面,锚文本用描述性短语。这一步既补了内链,又给生成式引擎提供了「同一主题下还有哪些权威页」的上下文:
<sectionclass="related-topics"aria-label="相关主题"><h2>相关主题</h2><ul><li><ahref="/products/cnc/vmc850/">VMC850 加工中心参数详解</a></li><li><ahref="/products/cnc/vmc650/">VMC650 与 VMC850 精度对比</a></li><li><ahref="/insights/2024/cnc-selection-guide/">数控加工中心选型指南</a></li></ul></section>三步做完,传统 SEO 的地基和 GEO 的适配层就都齐了:集群页喂结构化问答,支柱页给结论摘要,详情页补主题上下文,链接和层级这套骨架不用再动。
误区澄清或趋势预判
两个常见误区要提。第一个是只改 URL 不改内链,很多改版把 301 映射做得很完善,新结构上线后内链还是老样子,过两个月索引率纹丝不动,问题就出在 301 只转移单页权重、重建不了链接图;URL 和内链必须同一批改,缺一边都白干。第二个是支柱页写成大杂烩导航页,只有链接没有内容,Google 对「纯链接聚合页」的评估越来越严,支柱页必须有原创导览性内容才立得住。
趋势上说一句:AI 搜索起来的这两年,站内结构的马太效应在加重。生成式引擎给出的答案高度依赖少数权威来源,而「权威」的判断信号和传统索引一脉相承——主题聚焦、层级清晰、内链健康。老站的结构债越早还越便宜,等 AI 引擎也开始按链接图挑信源的时候,补课的成本只会更高。你要也在维护一个多年没动过结构的企业站,欢迎评论区聊聊你的索引率卡在哪一档。
参考与延伸
- Google SEO 入门指南(站内结构与链接基础):https://developers.google.com/search/docs/fundamentals/seo-starter-guide
- Google Search Console 帮助:网页索引报告的「已抓取 - 未编入索引」解读:https://support.google.com/webmasters/answer/7440203
- Google 搜索中心:Google 抓取与编入索引概览:https://developers.google.com/search/docs/crawling-indexing/overview
企业官网收录、pillar-cluster 模型、内链优化、面包屑导航、Google Search Console、技术SEO、站点层级改造