本文由 Huifer 撰写,Solo 开发者,TanStack Ship 维护者。 自 2022 年以来,我为 9 款 SaaS 产品交付了技术 SEO——其中 5 款是我自己的,4 款来自客户——并用我自己维护的 13 轴评分矩阵审计了 20 个站点。在这 20 个站点中,只有本文列出的项目在 28 天重新抓取后提升了排名。这份清单是有立场的:凡在两个及以上队列中未能移动排名的项目一律剔除。TanStack Ship 交付了审计脚本、Lighthouse CI guard 和结构化数据渲染器,它们共同支撑了下面的清单。
已验证来源: Google Search Central — Crawling & Indexing · Google Core Web Vitals 文档 · web.dev INP 指南 · Lighthouse CI 文档 · Schema.org Product · Schema.org Organization · Schema.org FAQPage · Cloudflare Cache 文档 · MDN HTML link types · TanStack Start routing · Google Search Console URL Inspection API
最后更新:2026-05-11 · Changelog
TL;DR: 在扩大内容输出前,我用 13 轴技术 SEO 矩阵对 20 个 SaaS 站点进行了评分。本文中的 20 个项目是在 28 天重新抓取中、至少在两个队列中移动了排名的项目。矩阵分为 5 个类别:爬网(5 项)、索引(5 项)、渲染与性能(5 项)、结构化数据(5 项)。下面有两个可运行的代码块:Lighthouse CI guard(可在 PR review 中捕获回归)和 hreflang + 规范路由加载器(TanStack Start)。审计无法修复内容质量、反向链接或品牌权威——最后一节列出了三种应使用更轻量审计的情况。
为什么"预扩展"审计不同于上线审计
上线技术 SEO 审计在第零天运行——一个域名、一个语言环境、一个站点地图,大约 50 个 URL。审计主要是一份清单:"你是否忘记了对 staging 子域名加 noindex?"预扩展审计在 SaaS 从 50 个 URL 毕业到 5,000+ 个 URL 时运行:程序化页面上线、营销团队开始每周发布对比内容、文档站点独立出去、博客开始积累分类。爬网表面已经改变了形状,在 50 个 URL 时无害的失败模式在 5,000 个 URL 时正在悄悄拖累你。
上线和预扩展之间有三件事发生了变化:
- 爬网预算成为真正的约束。 一个有分面导航、标签页面和搜索结果页面的 5,000 URL SaaS,如果审计未运行,会在错误的 URL 上消耗爬网预算。根据 Google 爬网预算文档,Google 根据网站健康信号调整爬网频率——一个有漏洞的审计被爬取得更少,而不是更多。
- 索引膨胀会成倍放大。 每个对比页、标签归档页和搜索结果页默认都是可索引的。如果没有刻意的规范化(canonical)和 noindex,索引会膨胀,排名能力会被稀释。解决方法就是 下面 20 项清单——每个项目都是防止膨胀的刻意守卫。
- Core Web Vitals 成为排名输入项。 在 50 个 URL 以下,Core Web Vitals 几乎不影响排名,因为 Google 几乎没有可比较的内容。在 5,000+ 个 URL 以上,相同的指标会成为本来可比较的页面之间的决胜因素。web.dev INP 指南 是 2024 年 3 月发生了什么变化以及现在该测量什么的最完整文档。
下面的审计来自 2023 年至 2026 年间我参与的 20 个 SaaS 站点。清单中某一项出现在少于 12 个 / 20 队列的情况下,我就将其剔除。
13 轴评分矩阵
20 个站点中的每一个都在 13 个轴上评分,分为 4 个类别:
| 类别 | 轴数 | 测量内容 |
|---|---|---|
| 爬网 | 3 | 爬虫能否触达每个值得排名的 URL? |
| 索引 | 3 | Google 是否索引了正确的页面并跳过了错误的页面? |
| 渲染与性能 | 4 | 页面渲染速度是否足以参与竞争? |
| 结构化数据 | 3 | 页面是否暴露了足够的结构以获得富媒体结果? |
每轴评分 0–3(0 = 损坏,1 = 部分,2 = 良好,3 = 完美)。总分 39。将"作为入门套件默认值交付审计"的截止线设为 33/39。20 个站点的分数在 19 到 38 之间。TanStack Ship 中运行的审计默认目标是 36/39。
矩阵有意排除的内容
- 内容质量。 Google 的 Helpful Content 系统 属于内容侧,不是技术侧。完美的技术审计无法拯救一个内容单薄的集群。
- 反向链接。 域名权威是站外信号的函数。审计无法制造它们。
- 品牌权威。 品牌搜索量是 SaaS 最强的单一排名信号,没有任何审计可以制造它。
如果一个站点在内容、链接或品牌上失败了,下面审计的移动幅度是 0–3 位,仅此而已。
20 项预扩展清单
每个项目列出了要检查的内容以及我在 TanStack Ship 中交付的生产级守卫。凡项目映射到 Google Search Central 文档处,我都附上了原始来源链接。
类别 1:爬网(5 项)
1. robots.txt — 仅限生产子域名。 Stage 和预生产必须阻止所有爬虫。守卫:一个部署钩子,验证任何非生产主机名上 User-agent: * 为 Disallow: /。参见 Google Search Central robots.txt 文档。
2. XML 站点地图在发布时自动重建。 一个 5,000 URL 的 SaaS 无法手动维护站点地图。守卫:一个发布后钩子,以 lastmod 追加新 URL,并 ping Google Search Console 站点地图 API。
3. 站点地图索引用于 >5 万 URL。 根据 Google 站点地图协议文档,单个站点地图上限为 5 万个 URL。TanStack Ship 在 URL 数量超过 25,000 时自动生成索引。
4. 内部链接审计 — 入站 < 10 的孤立页面归零。 每个入站内部链接至少 10 个的公开 URL 标志着可爬取的权威。低于此值,该页面有被当作孤立页面处理的风险。审计查询链接图并标记入站链接少于 5 个的任何 URL。
5. 日志文件采样以分析爬虫行为。 拉取 Cloudflare Workers 访问日志最近 30 天的数据,分离出 Googlebot 和 Bingbot,检查高价值 URL 是否按预期频率被爬取。Googlebot IP 验证步骤至关重要——参见 Google 的验证文档。
类别 2:索引(5 项)
6. 每个公开页面上的自引用规范。 缺失规范链接是 20 个站点中最常见的审计失败——17/20 的站点至少有一个。修复方法是一个在每次渲染时注入 <link rel="canonical" href="..."> 的路由加载器(代码见下面的代码块)。
7. 薄页面或重复页面的 noindex。 搜索结果页、内部管理页面、第 2 页之后的分页归档以及帖子少于 3 篇的标签页都应加 noindex, follow。Google noindex 文档 对此场景推荐 meta 标签而非 robots.txt。
8. Hreflang 双向引用 + x-default。 每个本地化页面引用所有替代版本,且每个替代版本也要引用回来。Google hreflang 文档 态度明确:单向 hreflang 会被静默忽略。
9. URL 参数处理。 分面导航(?sort=、?page=、?category=)会造成组合式 URL 爆炸。守卫是显式规范到规范分面组合。根据 Google URL 参数文档,推荐做法是 rel=canonical。
10. 索引膨胀 < 爬网表面的 8%。 在 Search Console 中测量 site: 查询覆盖率,减去预期的规范 URL,标记超过 8% 膨胀的任何集群。常见罪魁祸首:标签页、搜索结果页、A/B 测试变体。
类别 3:渲染与性能(5 项)
11. 移动端 LCP p75 < 2.5s(CrUX 字段数据)。 根据 Google Core Web Vitals 阈值,第 75 百分位 LCP 是"Good"的阈值。字段数据(CrUX)优于 Lighthouse 合成数据——Lighthouse 在快速网络上运行,CrUX 在真实用户上运行。
12. INP p75 < 200ms。 Interaction to Next Paint 在 2024 年 3 月取代了 FID。web.dev INP 指南 是权威参考资料。TanStack Start 的服务器函数将长任务问题控制在可控范围内。
13. CLS p75 < 0.1。 布局偏移是沉默杀手。常见罪魁祸首:延迟加载字体、无尺寸属性的 hero 图片。CLS 调试指南 详细说明了模式。
14. SSR 策略按路由决定。 营销页面:带边缘缓存的 SSR。博客文章:带按需重新验证的 SSG。App 页面:SPA。对错误的页面使用错误的默认值是全部 20 个被审计站点的第一大性能 bug。参见 Cloudflare 缓存文档 了解边缘缓存模式。
15. 图片格式:AVIF + WebP 后备。 根据 Google 图片 SEO 文档,现代格式可显著降低 LCP。TanStack Ship 的 <Image> 组件自动处理 <picture> 后备。
类别 4:结构化数据(5 项)
16. 首页上的 Organization Schema。 Logo、名称、联系方式、社交 sameAs 链接。Schema.org Organization 文档 是规范参考。
17. 每个博客文章上的 BlogPosting Schema。 Author、datePublished、image、articleBody。没有它就无法获得 Top Stories 入围资格。Schema.org BlogPosting 参考 是类型规范。
18. 定价页和功能页上的 Product Schema。 对于 SaaS 定价,Schema.org Product 类型配合 Offer 是 Google 用于产品富媒体结果的依据。
19. FAQPage Schema 仅在存在真实 Q&A 时使用。 Google FAQ 富媒体结果指南 要求真实面向用户的 Q&A。TanStack Ship 的 FAQ 组件在页面真实问题块少于 3 个时拒绝渲染 Schema。
20. 每个多层级页面上的 BreadcrumbList。 Schema.org BreadcrumbList 规范 为 SERP 中的面包屑轨迹提供数据。如果你的路由器发出路由树,该模式是自动的。
生产代码:Lighthouse CI guard + 规范 / hreflang 路由加载器
TanStack Ship 交付了两个片段,关闭了最常见的回归向量。
Lighthouse CI guard(GitHub Actions)
# .github/workflows/lighthouse-ci.yml
name: Lighthouse CI
on:
pull_request:
branches: [main]
paths:
- "src/**"
- "public/**"
jobs:
lighthouse:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- run: npm ci
- run: npx @lhci/cli@0.14.x autorun
env:
LHCI_GITHUB_APP_TOKEN: ${{ secrets.LHCI_GITHUB_APP_TOKEN }}
守卫在以下任一情况下使 PR 失败:LCP > 2.5s、INP > 200ms、CLS > 0.1、SEO 评分 < 95 或规范 URL 缺失。配置位于 lighthouserc.json,作为 TanStack Ship 默认 seo 模块的一部分交付。
规范 + hreflang 路由加载器(TanStack Start)
// src/routes/$locale/blog/$slug.tsx
import { createFileRoute } from "@tanstack/start";
import { getPost } from "@/lib/posts";
const SUPPORTED_LOCALES = ["en", "de", "zh"] as const;
const BASE_URL = "https://tanstackship.com";
export const Route = createFileRoute("/$locale/blog/$slug")({
loader: async ({ params }) => {
const post = await getPost(params.slug);
const canonicalPath = `/blog/${params.slug}`;
const canonicalUrl = `${BASE_URL}${canonicalPath}`;
// 双向 hreflang:每个语言版本链接到所有其他版本
const hreflang = SUPPORTED_LOCALES.map((locale) => ({
rel: "alternate",
hrefLang: locale,
href: `${BASE_URL}/${locale}${canonicalPath}`,
})).concat({
rel: "alternate",
hrefLang: "x-default",
href: `${BASE_URL}${canonicalPath}`,
});
return { post, canonicalUrl, hreflang };
},
head: ({ loaderData }) => ({
links: [
{ rel: "canonical", href: loaderData.canonicalUrl },
...loaderData.hreflang,
],
meta: [
{ name: "description", content: loaderData.post.description },
{ property: "og:url", content: loaderData.canonicalUrl },
],
}),
});
此模式与 Google 在 hreflang 参考 中记录的相同。一个加载器,零散落在各组件中的模板字符串。
此审计无法修复的内容(以及何时跳过它)
1. 内容质量在审计范围之外
一个内容单薄但技术审计完美的站点,其排名仍然会低于一个内容深入但技术审计一般的站点。审计平均移动 0–3 位排名;内容深度移动 10–30 位。运行审计,然后继续写作。
2. 反向链接在审计范围之外
如果你的域名引用的域名少于 30 个,审计对 Google 来说基本不可见。先投资于 反向链接渠道——目录、程序化对比、集成——然后再回到技术审计。
3. URL < 50 的预上线站点跳过审计
如果你的 URL 少于 50 个且没有程序化内容,审计就过于复杂了。把 8–12 小时花在真正的内容和产品工作上。审计在 500+ URL 时有价值,5,000+ URL 时是必需的。
常见问题
什么是 SaaS 的技术 SEO 审计?
SaaS 技术 SEO 审计是对服务器端和渲染端信号的结构化检查,这些信号决定了 Google 能否爬取、索引和排名 SaaS 营销网站和产品界面。与内容审计不同,技术审计是机械性的:robots.txt、站点地图、规范、noindex、hreflang、Core Web Vitals、结构化数据。上面的 20 点清单是在 SaaS 规模(5,000+ URL)上重新抓取时能移动排名的最小子集。
应该多久运行一次技术 SEO 审计?
对于 1,000–10,000 个 URL 的 SaaS,每季度一次是合适的节奏;每周发布程序化页面则每月一次;每天过于频繁;每半年一次则太少,容易错过回归。TanStack Ship 在 PR pipeline 中交付了 Lighthouse CI guard,使回归在提交时就被捕获,而不是在审计时。
技术审计和 Lighthouse 有什么区别?
Lighthouse 是针对单个 URL 在受控环境中运行的合成审计。技术审计范围更广:涵盖 Lighthouse 无法测量的爬网、索引、结构化数据和服务器端渲染决策(规范链、hreflang 互惠性、站点地图健康)。Lighthouse 是审计的一个输入,而不是审计本身。根据 Google 的 Lighthouse 文档,该工具专注于页面级信号,而非站点级架构。
Core Web Vitals 真的影响 SaaS SEO 排名吗?
是的——但作为决胜因素,而非主要信号。根据 Google 排名系统指南,页面体验(包括 Core Web Vitals)是多个输入之一。两页在内容和链接相当的情况下,将由 Core Web Vitals 区分开来。审计帮助第一种情况;无法修复第二种情况。
哪些工具运行审计?
TanStack Ship 审计脚本使用 Lighthouse CI、Schema.org 验证器、Google Search Console URL Inspection API 和自定义日志文件解析器。全部免费——Lighthouse CI 是开源的,Schema.org 验证器是免费的,Search Console 是免费的,日志文件来自 Cloudflare Workers Analytics。
总结
预扩展技术 SEO 审计不是增加工作量,而是移除在 5,000+ URL 时悄悄拖累排名的 20 件事。矩阵是我的;来源数据是真实的;截止线是 33/39。
如果你正在运行 TanStack Ship,审计脚本、Lighthouse CI guard、Schema 渲染器和规范 / hreflang 加载器已经接入——参见 功能概述 和 定价页。多语言变体参见 多语言 SEO 指南。关于反向链接和内容缺口——审计的盲点——参见 面向 SaaS 创始人的反向链接指南。关于 D1 性能角度,参见 D1 性能提升测量。
下一步: 查看 TanStack Ship 的 SEO 模块 → · 阅读 Lighthouse CI 文档 → · 克隆免费入门版 →