你应该也有过这种体验:
文章发出去了,链接也放进了 sitemap.xml,但 Bing 那边就是迟迟不收录,或者过了很久才更新标题和摘要。
这时候最让人焦虑的不是“没收录”,而是你根本不知道它什么时候会来抓,抓了哪一版,下一次又要等多久。
IndexNow 的价值就在这里:把“等爬虫”变成“主动通知”。
一句话版本:IndexNow 是一个 URL 提交通知协议。当你的页面新增、更新或删除时,你可以把 URL 主动推送给支持该协议的搜索引擎(包括 Bing)。
它不是替代 SEO 的魔法按钮,更像是“内容变更信号总线”。
你可以把它和 sitemap 的关系理解成这样:
| 能力 | Sitemap | IndexNow |
|---|---|---|
| 信息形态 | 站点清单(被动发现) | 变更通知(主动推送) |
| 时效性 | 取决于爬虫调度 | 由你触发,通常更快 |
| 适合场景 | 全站基础索引 | 新文发布、旧文更新、批量内容变更 |
| 是否互斥 | 否 | 否 |
所以正确姿势不是二选一,而是两者都做:
sitemap 负责“你有哪些页面”;IndexNow 负责“哪些页面刚刚发生了变化”。IndexNow 要求你声明站点所有权。通常做法是生成一个 key,并在根目录可访问到一个同名 .txt 文件。
比如 key 是 abc123,那就需要能访问到:
https://your-site.com/abc123.txt文件内容通常就是 key 本身。
核心请求体一般是这四个字段:
{
"host": "your-site.com",
"key": "abc123",
"keyLocation": "https://your-site.com/abc123.txt",
"urlList": [
"https://your-site.com/posts/post-a",
"https://your-site.com/posts/post-b"
]
}其中 urlList 才是关键。你更新了哪些页面,就推哪些,没必要每次全站重推。
IndexNow 解决的是“发现效率”,不是“内容质量”。
你把门铃按得再快,屋里要是没人,门也不会自动开。
内容质量、站内结构、链接关系、页面体验,这些 SEO 基本盘依然是决定排名的核心。
你这个项目已经有一套很实用的实现思路,我建议继续沿用。
scripts/indexnow.ts 的逻辑很清晰:
content/posts 下的文章;POST 到 https://api.indexnow.org/indexnow。如果你希望每次发布后手动执行一次,这个脚本就足够了:
bun run indexnow优势是可控、低心智负担,适合个人站和中小规模内容站。
项目里还有 app/api/cron/indexnow/route.ts,它把两件事打包到一个定时入口里:
同时它用 CRON_SECRET 做了鉴权,避免接口裸奔在公网。
如果你已经在 Vercel 上配置了定时任务,这个方式会更稳,尤其适合“固定频率更新”的站点。
很多人第一次接 IndexNow,最常见操作是“每次都提交全站 URL”。能跑,但不优雅。
更推荐的策略是:
这样做的好处:
keyLocation 能拼出来,但文件实际上访问不到这是最常见的“看起来没错、实际上失败”问题。
检查点很简单:直接在浏览器打开 https://your-site.com/<key>.txt,确保返回 200 且内容正确。
你的脚本里已经考虑了 INDEXNOW_KEY。如果生产环境漏配,它会直接失败或跳过。
发布前建议把这几个变量做成固定检查项:
INDEXNOW_KEYCRON_SECRET(如果走 cron 路由)200/202 表示搜索引擎收到了通知,不表示一定立即抓取,更不表示立即有排名变化。
这点认知要提前统一,否则你会在日志绿了之后产生错误预期。
IndexNow 只是加速器,不是底盘。
如果 sitemap、内部链接、canonical、metadata 本身混乱,推送再积极也只是“更快地通知一个不清晰的站点”。
如果你是博客、文档站、资讯站,且更新频率不低,IndexNow 是一个投入极低、收益稳定的工程项。它不会让你一夜之间排名暴涨,但会明显改善“内容更新 -> 搜索引擎感知”的延迟。
我的建议是把它放到 SEO 工程的第二层:
这样做,你得到的是一个可持续的增长系统,而不是一次“看运气”的提交动作。
我自己现在也不再纠结“什么时候会被抓取”这个问题了。因为至少在 Bing 这条链路上,我已经把被动等待改成了主动触发。剩下的,就是内容本身要不要让人愿意点进来、读下去、再回来。