SEO·AEO 给开发者

第 0007 课 · 告诉引擎你改了什么

Sitemap + IndexNow

发布一个页面只完成了一半的工作。另一半是 ping(推送/通知):一种机制让每个引擎按各自缓慢的节奏自行拉取,另一种则即时推送——推给除 Google 之外的所有引擎。

回顾 第 0006 课:我们确认了你的内容确实存在于服务器发送的 HTML 之中。现在页面存在了,也能渲染了。但引擎仍然必须发现它的存在,或它发生了变更。这一发现步骤本身就是管线中的一个阶段——而且是整门课里最容易自动化的一个。

两种通知机制,而它们之间的不对称正是本课的重点。sitemap被动的(passive):一份你的 URL 列表,引擎想拉就拉——慢,但通用,连 Google 也包括在内。IndexNow主动的(active):你 POST 变更过的 URL,参与的引擎会在几分钟内抓取,然后彼此之间共享这次 ping。[2] 问题在于:Google 不参与 IndexNow——它依赖自己的抓取调度加上你的 sitemap。[3] 所以一条真正的发布管线(publish pipeline)两者都会触发。

你的收获: sitemap_ping.py 能从一份 URL 列表生成一个符合规范的 sitemap.xml,对照 sitemaps.org 的真实上限校验一个现有文件,并构建一个正确的 IndexNow payload(key + keyLocation + urlList)——正是一个发布钩子应该发起的那两次调用。

谁听谁的

机制GoogleBing / Yandex / Naver / Seznam速度
sitemap.xml(被动拉取)慢——按引擎自己的节奏
IndexNow(主动推送)否——忽略它[3]是——所有引擎共享[2]几分钟

为什么开发者要关心那些被 Google 冷落的引擎:其中好几个为 AI 答案供料(Bing 的索引就支撑着 Copilot 等产品),所以一次即时的 IndexNow 推送在某种程度上是一步 AEO 发现动作,而不只是经典 SEO。

sitemap.xml —— 被动列表
一个文件,≤ 50,000 个 URL 且未压缩 ≤ 50 MB。必填标签:<loc>。可选 <lastmod>(W3C 日期)。[1]

所有 URL 必须位于同一个 host。通过 Search Console 或 robots.txt 提交一次;之后由 Google 按自己的节奏重新抓取。

✓ 通用 · ✗ 慢,没有"它变了!"的信号
IndexNow —— 主动推送
向端点 POST {host, key, keyLocation, urlList},每次调用 ≤ 10,000 个 URL[2]

key = 8–128 个字符 [a-zA-Z0-9-],托管在你根目录下的一个文本文件里,这样引擎才能验证你拥有该站点。

✓ 即时 + 共享 · ✗ 不含 Google

工具:构建、校验、推送

这两半都是纯数据转换——非常适合放进一个发布钩子里,而且可以离线测试。IndexNow 这一侧会在任何数据真正触网之前就把一切校验完毕:

# IndexNow payload is built + checked offline; --send is the only network call
key matches  ^[A-Za-z0-9-]{8,128}$     # or it's rejected
all URLs share one host                # keyLocation must be on it too
<= 10,000 URLs per post
# sitemap side: well-formed, <=50k URLs, <=50MB, one host, valid lastmod

生成的那个 sitemap.xml 是纯粹符合规范的 XML——每个 URL 一个 <loc>,可选的 <lastmod>,全都在同一个 host 上:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://yoursite.com/new-page</loc>
    <lastmod>2026-06-22</lastmod>
  </url>
</urlset>

……而 IndexNow 的试运行(dry run)会在任何 --send 之前打印出准确的 POST 请求体:

{
  "host": "yoursite.com",
  "key": "a1b2c3d4e5f6a7b8",
  "keyLocation": "https://yoursite.com/a1b2c3d4e5f6a7b8.txt",
  "urlList": ["https://yoursite.com/new-page"]
}
现在就做:
  1. 自检(离线):python3 tools/sitemap_ping.py --demo
  2. 做一个 urls.txt(每行一个 URL,可选地加一个 tab + lastmod),生成并校验:python3 tools/sitemap_ping.py gen urls.txt > sitemap.xml,然后 python3 tools/sitemap_ping.py check sitemap.xml
  3. 构建一次 IndexNow 推送(试运行——会打印出 key 文件那一步以及准确的 POST 请求体):python3 tools/sitemap_ping.py indexnow https://yoursite.com/new-page --key <your-key>
$ python3 tools/sitemap_ping.py check sitemap.xml

Sitemap check
──────────────────────────────────────────────
[PASS] well-formed XML
[PASS] root is <urlset>
[PASS] every <url> has a <loc>  (412 urls)
[PASS] <= 50,000 URLs  (412)
[PASS] <= 50 MB uncompressed
[FAIL] all URLs share one host  (site.com, cdn.site.com)
[FAIL] lastmod dates valid (W3C)  (2 bad: ['19/06/2026'])
──────────────────────────────────────────────
VERDICT: 2 problem(s) — engines may reject it.
三个管线陷阱。 (1)IndexNow ≠ Google。向 IndexNow 推送后却看到 Google 那边毫无动静,这是预料之中的——Google 从未采纳它。[3] Google 唯一的推送 API 是 Indexing API,仅限 JobPosting 和直播页面;其他一切都走 sitemap + 抓取调度,外加 Search Console 里手动的”请求编入索引”(Request indexing)。(2)key 文件必须真的可以访问到,位于 keyLocation 处并且包含那个 key,否则每次推送都会被拒绝——和 robots.txt 是同一套信任模型。(3)sitemap 是发现手段,不是排名杠杆。列出一个 URL 能让它被找到;至于它能否排名或被引用,sitemap 起不到任何作用。别指望单靠 sitemap 带来流量。

需要知道的上限:sitemap_ping.py 写的是单个 sitemap;超过 5 万个 URL 时你就需要一个 sitemap index(一份关于多个 sitemap 的 sitemap)——工具里把它标注为下一步升级项。它默认让 IndexNow 走试运行;--send 是唯一会触网的那一行。

提取练习 · 不许偷看

ping 自检

凭记忆作答——正是这份努力让知识留得住。每题只有一次机会;在看其他选项前先选。

第 1 / 4
哪个引擎忽略 IndexNow,转而依赖 sitemap 加上自己的抓取(crawl)节奏?
第 2 / 4
sitemap 和 IndexNow 的核心区别是什么?
第 3 / 4
为什么 IndexNow 的 key(密钥)必须放在你站点根目录的一个文件里?
第 4 / 4
你的单个 sitemap 刚刚超过了 50,000 个 URL。规范接下来要求你做什么?
一手来源 — 接下来读这个 (≈12 分钟)
"The Sitemap protocol" — sitemaps.org

权威规范:各种标签、50,000 URL / 50 MB 上限、W3C 日期(W3C date)格式、单 host 规则。配合 Google 的 <a href="https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap">"Build and submit a sitemap"</a> 了解提交方式,以及 <a href="https://www.indexnow.org/documentation">IndexNow protocol docs</a>(key + payload 载荷)。Google 不参与这件事,在 <a href="/zh/resources/">RESOURCES</a> 中有跟踪记录。

卡住了,或者好奇? 这个 agent 就是你的老师。尽管问——“给我看一个真实的 robots.txt”、“Claude 和 Perplexity 的 retrieve 方式不一样吗?”——追问是学得最快的方式。