第 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)——正是一个发布钩子应该发起的那两次调用。 谁听谁的
| 机制 | Bing / Yandex / Naver / Seznam | 速度 | |
|---|---|---|---|
sitemap.xml(被动拉取) | 是 | 是 | 慢——按引擎自己的节奏 |
| IndexNow(主动推送) | 否——忽略它[3] | 是——所有引擎共享[2] | 几分钟 |
为什么开发者要关心那些被 Google 冷落的引擎:其中好几个为 AI 答案供料(Bing 的索引就支撑着 Copilot 等产品),所以一次即时的 IndexNow 推送在某种程度上是一步 AEO 发现动作,而不只是经典 SEO。
<loc>。可选 <lastmod>(W3C 日期)。[1]所有 URL 必须位于同一个 host。通过 Search Console 或
robots.txt 提交一次;之后由 Google 按自己的节奏重新抓取。✓ 通用 · ✗ 慢,没有"它变了!"的信号
{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"]
}
- 自检(离线):
python3 tools/sitemap_ping.py --demo - 做一个
urls.txt(每行一个 URL,可选地加一个 tab + lastmod),生成并校验:python3 tools/sitemap_ping.py gen urls.txt > sitemap.xml,然后python3 tools/sitemap_ping.py check sitemap.xml - 构建一次 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.
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 自检
凭记忆作答——正是这份努力让知识留得住。每题只有一次机会;在看其他选项前先选。
权威规范:各种标签、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> 中有跟踪记录。