没有不值得去解决的问题,也没有不值得去学习的技术!

IndexNow 实战:手工提交长期不显示,Cloudflare Crawler Hints 却很快出现在 Bing Webmaster Tools

图 3:英文站 3 小时内出现 565 个 Cloudflare 来源 URL

作者:

A Tour of Go 多语言翻译项目

图3:访问过去的 Go Tour 简体中文站 tour.go-zh.org 时,当前已经无法正常建立连接。

(1) 从「A Tour of Go 中文版」这个搜索词开始:我决定做一个持续维护的 Go Tour 中文版

本地运行的 A Tour of Go「Methods continued」课程页面,左侧为课程说明,右侧为 Go 代码编辑器及运行结果。

(2) A Tour of Go 中文版项目设计冻结:从 101 页到 103 页,从 Gin 转向 Cobra CLI

A Tour of Go 中文版开发实战:英文基线、在线运行与 101 页上游同步体系

(3) A Tour of Go 中文版开发实战:英文基线、在线运行与 101 页上游同步体系

go-tour-i18n 项目完成首个简体中文课程页面 welcome/1 的整页翻译、结构校验和本地预览。

(4) A Tour of Go 多语言翻译项目实录:完成首个 zh-CN 页面翻译闭环

图 1:DeepSeek 官方更新日志显示,本次只更新 DeepSeek-V4-Flash,DeepSeek-V4-Pro API 与 APP、Web 模型均未更新

(5) A Tour of Go 中文翻译项目进展:完成前 8 页、修复 present 语法,并暂缓 DeepSeek 对比

图 1:generics/1 简体中文页面本地预览

(6) 一个页面重试五次:使用 GLM-5.2 翻译 A Tour of Go 时遇到的 Token 与 Present 结构问题

图 1:methods/16 简体中文页面浏览器预览

(7) A Tour of Go 中文翻译实录:如何只翻译教学代码注释,而不破坏 Go 代码

图 2:A Tour of Go methods/20「练习:错误」中文候选页面最终渲染效果

(8) A Tour of Go 多语言翻译:当正确的中文语序被受保护标记顺序校验误判

图 3:methods/24 中文页面,静态代码、Bounds 行内代码和链接内的 image.Rectangle 均正确渲染

(9) A Tour of Go 中文翻译完成 7 个代表页校准:最后 3 页又发现了哪些真实问题

图 2:首批 10 个普通页面经过试跑与流程校准后全部进入 ready

(10) A Tour of Go 多语言翻译项目:首批 10 个普通页面试跑,从 2 个 blocked 到全部 ready

图 2:flowcontrol/6 最终中文页面,return 与 v 为适应自然中文语序发生整体换位

(11) A Tour of Go 中文翻译第二批实跑:从 Inline Code 顺序误判到历史响应重新验证

图 1:flowcontrol/6 首次原始输入实验直接通过统一自动校验

(12) A Tour of Go 多语言翻译项目:从 swap 问题重新审视 Token 保护,原始输入与最小保护的一次真实实验

图 7:moretypes/1 最终中文页面预览。左侧课程正文、静态代码块、行内代码和教学注释均正常渲染,右侧官方 Go 示例继续保持原样。

(13) A Tour of Go 多语言翻译实战:第三批 10 页全部 Ready,继续校准 Protected Token 的结构角色

图 4:上游源码确认共有 103 个课程页面,zh-CN 最终达到 ready=103、pending=0、blocked=0

(14) A Tour of Go 多语言翻译项目:zh-CN 103 个课程页面全部 ready,课程正文翻译阶段完成

图 4:GitHub 与 ChatGPT 已成功连接

(15) ChatGPT 连接 GitHub 实测:让 AI 直接读取 go-tour-i18n 仓库参与译文审核

图 3:中文 Go 术语校准完成后,将确定的译法写入 zh-CN glossary

(16) 为什么 channel 最终选择“通道”:A Tour of Go 中文术语统一的一次实践

图 1:技术含义基本正确,但“返回一个返回……”已经明显影响阅读,因此仍被列入 C 类修订

(17) 103 页逐页审核后,只返修 16 页:A Tour of Go 中文正文发布前质量审计

图 2:中文课程页面以及已经完成本地化的编辑器控制区

(18) A Tour of Go 多语言翻译项目:公共 UI 本地化完成,从课程译文走向完整中文界面

图 2:完整 zh-CN 正式投影成功生成,103 个课程页面被重新组装为 7 个 .article

(19) 从 103/103 ready 到完整站点验收:A Tour of Go 中文版补齐正式投影与课程元数据本地化

图 3:从 production bundle 独立启动的 A Tour of Go 简体中文页面,课程正文、公共 UI 和官方 Go 示例均已进入最终发布形态。

(20) A Tour of Go 多语言翻译项目:103 页全部完成后,我终于生成了可独立部署的 zh-CN Production Bundle

图 1:A Tour of Go 简体中文版正式生产页面,远程运行已经成功输出“Hello, 世界”。

(21) A Tour of Go 多语言翻译项目:zh-CN 正式上线,从生产发布到 go.dev Playground 的完整部署记录

图 1:新生产域名 go-dev.shuijingwanwq.com 已正常访问,Go 示例远程运行成功

(22) A Tour of Go 多语言翻译项目:从 go-tour 到 go-dev,完成 EdgeOne、Nginx 与 HTTPS 生产域名迁移

图 1:A Tour of Go 多语言翻译项目正式生产首页

(23) A Tour of Go 多语言翻译项目正式上线:从项目首页、公共 Footer 到生产发布元数据的完整收尾

图 3:GA4 g/collect 请求返回 HTTP 204,并携带当前课程页面地址,确认 Google Analytics 已产生真实事件上报

(24) A Tour of Go 多语言翻译项目:接入 Google Analytics 与百度统计,从 systemd 注入到 EdgeOne 与真实上报验证

图 1:生产环境 robots.txt 与 sitemap.xml 已正确对外提供,Sitemap 共包含 104 个规范 URL。

(25) A Tour of Go 中文站上线后:补齐 robots.txt、Sitemap,并完成五大搜索引擎提交

图 4:发布生产并刷新 EdgeOne 缓存后,再次通过真实手机访问,顶栏项目名称已经完整保持在一行,最终移动端验收通过。

(26) A Tour of Go 多语言翻译项目:修复手机端首页顶栏标题换行,并完成真机验证

图 3:生产自动部署脚本第一次真实运行时,systemd 已经显示 active,但首次 localhost 探测仍然得到 HTTP 000;随后连续 3 次同时满足 active + HTTP 200 后,脚本才判定部署成功,并继续完成公网 HTTP 200 验收。这次真实运行验证了连续应用层健康检查的必要性。

(27) A Tour of Go 多语言翻译项目:从一次 203/EXEC 故障到生产自动部署脚本落地

图 1:阿里云生产环境访问 go.dev Playground 时出现 TLS 握手超时

(28) A Tour of Go 多语言翻译项目:为 Playground 搭建独立的 ZgoCloud 执行代理

图 3:清除 /tour/script.js 缓存后,Run 已直接请求 ZgoCloud /compile 并返回 HTTP 200

(29) A Tour of Go 多语言翻译项目:将生产 Run / Format 切换到 ZgoCloud 执行节点

【图 1:微信中运行 Go 示例时出现 Error communicating with remote server.】

(30) A Tour of Go 中文版手机端运行与格式化偶发失败排查:从间歇性报错到补强 Nginx 可观测性

【图 4:向 golang-dev 公开邮件列表发送 Playground 使用告知邮件并投递成功】

(31) A Tour of Go 多语言项目:为 Playground 代理增加唯一 User-Agent,并主动告知 Go 官方

【图 3:百度剩余 9 个核心 URL 提交成功,remain 归零】

(32) A Tour of Go 搜索引擎收录实测:从 Google 自然索引到百度主动提交与 Bing IndexNow

【图 1:当前正式中文 methods/24 页面,右侧示例代码运行成功】

(33) A Tour of Go 中文翻译完成后,我为什么重新评估 minimal-protect 翻译模式

【图 3:5 个页面 Request SHA256 完全一致,但 Response SHA256 全部不同】

(34) A Tour of Go 翻译实验:更多原始上下文为什么没有更好?从 157 个保护标记到 30 次重复盲评

图 3:3 个代表页 × 4 个评审模型,共 12 次匿名评审的完整排名与第一名票数。

(35) A Tour of Go 翻译质量再评估:minimal-protect 未达预期后,我开始比较 ChatGPT、Codex 与 GLM-5.2

图 2:GitHub 中的 chatgpt-zh-CN-008 重译批次。一个 Batch 同时保存 inputs、raw-responses、candidates、validation 和 retry 记录,GitHub 成为 ChatGPT 与本地翻译流水线之间的数据交接层。

(36) 没有 OpenAI API,我如何用 ChatGPT + GitHub 完成 A Tour of Go 103 页全量重译

图 1:103 个正式课程页面完成最终语义质量审核,结果为 A=103、B/C/D=0,同时不存在缺失、重复或额外页面。A/B/C/D 是本轮项目内部语义质量分级,并不是自动结构 validator 的结果。

(37) 103 页翻完还不能发布:A Tour of Go ChatGPT 译文的语义审核与 Canonical Promotion

图 3:7 个 article endpoint 的 production origin 与 EdgeOne 公网响应全部 exact match,同时新的 ChatGPT 译文标记存在,旧版译文标记已经消失。

(38) 103/103 与 7/7 Exact Match:A Tour of Go ChatGPT 新译文的最终线上验收

【图 2:upstream source preview】

(39) A Tour of Go 多语言翻译项目首次实现 upstream 同步机制:从一次性翻译到长期维护

图 2:A/B/C/D 质量评级规则,展示正式质量 rubric 与 Promotion gate。

(40) A Tour of Go 多语言翻译项目引入 Translation Quality Review:从自动验证到 AI 翻译质量控制

图 4:翻译后 Playground Example,展示中文注释与保持不变的 Go 代码结构。

(41) A Tour of Go 多语言翻译项目实现 Playground Example 本地化:从代码注释翻译到完整学习体验

图 5:公网页面验证广告脚本输出

(42) A Tour of Go 多语言翻译项目接入广告系统:从 AdSense 专用配置到通用 HTML 注入架构

图 3:百度统计单页应用设置

(43) go-dev 单页网站接入统计与 Google AdSense Auto Ads 验证记录

图 1:GitHub 仓库中的多语言翻译项目结构

(44) A Tour of Go 多语言翻译项目:选择日语作为第二语言并启动翻译验证

图 5:模型身份描述不一致

(45) A Tour of Go 多语言翻译项目中的 AI 协作异常排查:一次长期工程会话失效分析

【图 1:ChatGPT GitHub 写入流程调整说明截图】

(46) go-tour-i18n 翻译流程调整:从 ChatGPT GitHub 写入到本地 artifact 导入

图 4 展示了本次异常状态。

(47) go-tour-i18n 翻译自动化流程复盘:已验证的 ChatGPT 翻译能力在新任务中的稳定性问题

【图 6:全部评审结束以后才读取 secret key,完成最终揭盲】

(48) A Tour of Go 翻译质量再评估:Codex High 已接近 ChatGPT High,我决定调整默认翻译引擎

图 4:ja-JP 生产课程页实际运行 Go 示例

(49) A Tour of Go 日语版正式上线:第二门语言 ja-JP 完成生产发布

图 1:ja-JP 上线以后,先提交“新增语言标准化流程”

(50) A Tour of Go 多语言扩展复盘:为第三门语言建立标准化流程

图 1:课程正文结束以后,页面左侧仍然存在大块视觉空白,但 AdSense 并没有在这里插入展示广告。

(51) A Tour of Go 明明有大片空白,为什么 AdSense 就是不显示展示广告?

图 2:golang/website 当前的 _content/tour/。课程内容、静态资源和模板都在这个上游目录中持续维护。

(52) 为了 AdSense,要不要放弃 SPA?A Tour of Go 页面架构的一次取舍

图 4:最终的手动课程广告真实展示在课程内容区域内,而不是 footer 之后。

(53) 保留 SPA 以后,广告应该放在哪里?从 AdSense 预览到方案 B

图 1:Google Search Console 中,多个不同的 A Tour of Go 课程 URL 被判断为“重复网页,用户未选定规范网页”。

(54) SPA 的 SEO 老问题:为什么最后还是给 103 个 A Tour of Go 课程页生成了 Prerender HTML

图 2:方案 B 生产环境中,源码已经正常,但课程主体高度异常缩短,footer 提前进入第一屏。

(55) 从源码空白到 AdSense 高度污染:A Tour of Go 方案 B 的生产收尾

图 1:A Tour of Go 德语版 de-DE 已正式运行在生产环境

(56) A Tour of Go de-DE 上线复盘:第三门语言用了约 16 小时,下一门如何压到 8 小时?

图 1:fr-FR 首次 production 验收完成后,我没有立即开始 ko-KR,而是先连续完成新增语言与首次生产流程的优化

(57) 法语版上线后,我没有马上开始韩语:A Tour of Go 新增语言流程的一轮完善与简化

图 1:根据 ko-KR 期间 76 次 Git 提交估算实际工作时间

(58) 原本预计 6 小时,最后用了约 16~18 小时:A Tour of Go 韩语版上线复盘

图 2:英文 source 与当时发生 validation failure 的 ko-KR candidate 对比

(59) Validator 报错,到底该改译文还是改规则?一次 A Tour of Go 韩语翻译实战

图 2:法语 A Tour of Go 仓库目前已经归档,页面仍保留 553 Commits 和 61 Contributors 的历史

(60) 从法语 553 次提交到韩语两代离线:A Tour of Go 社区翻译为什么难以长期维护

【图 4:es-ES 首次 Production 收口后连续完成的流程优化 commit】

(61) 从 es-ES 首次上线复盘:我把 A Tour of Go 新增语言的 Production 流程又收敛了一轮

图 1:旧公网验收链路连续出现 curl 28 超时,最终导致 public-machine 阶段失败

(62) A Tour of Go Production 公网验收踩坑:从跨境 SOCKS 链路改为 zgocloud direct

图 1:两次 Production Machine Acceptance 都已经通过,但 Headless Chrome 分别在 / 和 /tour/ 判定页面没有完成渲染

(63) 页面明明能打开,为什么 Headless Chrome 仍然判定 Production 失败?

图 3:Bing 从 Google Search Console 中识别到新的 it-IT 站点,并同时发现已有的 1 个 sitemap

(64) GSC → Bing Webmaster Tools:多语言站点如何减少重复验证

图 3:英文站 3 小时内出现 565 个 Cloudflare 来源 URL

(65) IndexNow 实战:手工提交长期不显示,Cloudflare Crawler Hints 却很快出现在 Bing Webmaster Tools

最近在给 A Tour of Go 多语言项目做搜索引擎收口时,我开始正式接入 IndexNow。

一开始我的想法很简单:每增加一门语言,除了在 Google Search Console、Bing Webmaster Tools 中提交 Sitemap,还希望主动把整站 URL 通知给支持 IndexNow 的搜索引擎。

但实际折腾下来,过程远没有想象中顺利。

最让我困惑的是:

IndexNow API 明明已经返回了 HTTP 200,Bing Webmaster Tools 却长期只显示 Get Started

甚至这并不是等一两个小时的问题。

更早之前,我就已经尝试过 IndexNow 接口提交,也出现过 HTTP 200,但 Bing 后台一直没有任何提交记录。后来为了确认到底是哪一步出了问题,我又重新生成 Key、分别测试不同子域名、尝试全局 IndexNow endpoint,甚至直接调用 Bing 自己的 IndexNow endpoint。

接口层面都已经成功了,Dashboard 还是没有变化。

直到后来开启 Cloudflare Crawler Hints,再过一段时间重新查看 Bing Webmaster Tools,事情才开始变得有意思起来。

目前我的直观感受甚至是:

在 Bing Webmaster Tools 能看到的实际效果上,Cloudflare Crawler Hints 比我自己直接调用 IndexNow API 明显得多。

当然,这并不能证明自己直接提交没有作用。只能说从目前能够看到的 evidence 来看,Cloudflare 这一条链路表现得更加明显。


一、为什么还需要 IndexNow

A Tour of Go 多语言项目现在已经上线了多个语言站。

每增加一门语言,大约都会新增一百多个页面。

上线以后的搜索引擎收口通常包括:

Plaintext
Google Search Console
→ Bing Webmaster Tools
→ locale-specific search engine

同时提交对应站点的 Sitemap。

但 Sitemap 解决的主要是:

告诉搜索引擎,这个站有哪些 URL。

什么时候真正抓取、什么时候建立索引,还是由搜索引擎自己决定。

IndexNow 则提供了另一种方式:

页面新增、更新或删除以后,主动把 URL 变化通知给支持 IndexNow 的搜索引擎。

这对我的多语言项目比较合适。

因为每增加一个 locale,都是一次集中上线大量新页面。

另外还有一个我比较看重的地方:

IndexNow 并不只服务于 Bing。

只要搜索引擎参与 IndexNow 生态,理论上就有机会通过这套协议收到 URL 更新通知。

对于一些平时我根本不会专门去注册 Webmaster Tools、也不会单独维护 Sitemap 提交流程的小众搜索引擎来说,这相当于多了一条发现页面的渠道。

它当然不能保证收录,但至少能够增加:

Plaintext
被更多搜索引擎发现
→ 被抓取
→ 最终获得索引和流量

的机会。

对于多语言站来说,这一点还是有价值的。


二、最开始的 IndexNow 提交并不顺利

IndexNow 的基本接入并不复杂。

先生成 Key,然后把:

Plaintext
<key>.txt

部署到网站根目录。

例如:

Plaintext
https://example.com/<key>.txt

访问这个地址时,内容必须能够正确返回对应的 Key。

随后就可以向 IndexNow endpoint 提交 URL。

但第一次测试时,我得到的是:

Plaintext
HTTP 202

刚开始看到 202 时,我一度怀疑是不是提交方式有问题。

后来确认,202 在这里代表的不是普通意义上的“提交完成”,而是:

Plaintext
请求已经收到
但 Key validation 仍然 pending

所以后来形成的处理方式是:

Plaintext
202
→ 不换 Key
→ 不全量提交
→ 等一段时间
→ 使用同一个 Key 再试

然后再判断是否已经变成:

Plaintext
HTTP 200

三、Key validation 的时间并不固定

这个过程后来我连续测试了多个站。

结果发现等待时间差异非常明显。

有的新 Key 从:

Plaintext
202

变成:

Plaintext
200

用了两个多小时。

而后来给 www.shuijingwanwq.comen.shuijingwanwq.com 创建的新 Key,大约二十分钟以后再次测试,就已经返回 200。

所以我后来不再给它设置什么固定等待时间。

现在的规则很简单:

Plaintext
HTTP 202
→ pending
→ 暂停

稍后重新执行
→ HTTP 200
→ 再开始全量提交

这样比人为规定“等 10 分钟”“等 30 分钟”更可靠。


四、真正让我困惑的是:HTTP 200 以后,Bing 还是 Get Started

如果只是遇到 202,其实还比较容易理解。

真正让我折腾很久的是:

API 已经明确返回 HTTP 200,但 Bing Webmaster Tools 里面完全看不到。

中文 A Tour of Go 站:

Plaintext
go-dev.shuijingwanwq.com

长期打开 IndexNow 页面,看到的都是下面这个界面。

图 1:Bing Webmaster Tools 一直显示 Get Started
图 1:Bing Webmaster Tools 一直显示 Get Started
Bing Webmaster Tools IndexNow Get Started

这并不是我刚提交完马上去看的结果。

更早之前我就已经做过接口提交,也遇到过成功的 200,但后台一直没有变。

后来重新做多语言 IndexNow 时,我又专门进行了更严格的验证。


五、为了排查 Dashboard,我甚至重新设计了一次完整实验

我当时怀疑过很多可能:

Plaintext
是不是 Key 有问题?
是不是一个 Key 不能给多个子域使用?
是不是 Bing property 创建得太晚?
是不是 api.indexnow.org 提交以后,Bing Webmaster Tools 不认?
是不是必须直接请求 Bing 自己的 endpoint?

所以后来重新做了一轮。

首先,每个 hostname 都改为使用独立 Key。

然后保证:

Plaintext
https://<hostname>/<key>.txt

能够返回:

Plaintext
HTTP 200

并且内容完全正确。

再提交一个单独 URL。

最开始:

Plaintext
HTTP 202

等待 Key validation 完成以后:

Plaintext
HTTP 200

随后再把整个 Sitemap 的 URL 一次性提交。

多个站点最终都成功返回:

Plaintext
HTTP 200

六、意大利语站又做了一次更干净的实验

后来新上线了意大利语:

Plaintext
it-go-dev.shuijingwanwq.com

我觉得这是最后一次排查这个问题的好机会。

因为之前有一个变量一直没完全排除:

会不会是因为 IndexNow 提交发生在 Bing Webmaster Tools property 创建之前,所以 Dashboard 没有记录历史数据?

于是这一次专门反过来:

Plaintext
先创建 Bing Webmaster Tools property
→ 再部署全新的 IndexNow Key
→ 再开始第一次 IndexNow 提交

第一次:

Plaintext
HTTP 202

等待以后:

Plaintext
api.indexnow.org
→ HTTP 200

为了再排除最后一个变量,我甚至不用全局 endpoint,而是直接调用 Bing 自己的 IndexNow endpoint。

结果:

Plaintext
HTTP 200

但回到 Bing Webmaster Tools:

Plaintext
仍然是 Get Started

到这里我基本不想继续折腾 Dashboard 了。

因为从协议和接口层面看:

Plaintext
公网 Key:正常
Sitemap:正常
global endpoint:200
Bing direct endpoint:200

还能继续怀疑的东西已经非常少。

所以项目里最后形成的规则是:

HTTP 200 作为 IndexNow submission success 的机器 evidence,Bing Webmaster Tools Dashboard 不作为 gate。


七、但是第二天再看,事情突然变了

到了第二天,我无意中再次打开 Bing Webmaster Tools。

这时候才发现:

IndexNow 页面竟然开始显示数据了。

这也是为什么我觉得必须把前面的过程写详细一点。

如果只写:

Plaintext
昨天提交
→ 今天出现

看起来好像只是正常等待了一天。

实际情况完全不是这样。

在这之前,我已经经历过:

Plaintext
早期 IndexNow 提交
→ 出现 HTTP 200
→ Bing 长期 Get Started

重新部署独立 Key
→ 202
→ 等待
→ 200
→ Bing 仍 Get Started

创建独立 Bing property
→ 再提交
→ 200
→ 仍 Get Started

意大利语站 property 先建
→ 新 Key
→ 202
→ global endpoint 200
→ Bing direct endpoint 200
→ 仍 Get Started

最后我实际上已经放弃继续用 Dashboard 判断成功与否。

结果第二天再打开的时候,它自己开始显示数据了。


八、主站终于出现了一条 Self 记录

主站现在已经能够看到一条提交记录。

图 2:主站出现 Self 来源的 IndexNow URL
图 2:主站出现 Self 来源的 IndexNow URL
Bing Webmaster Tools Self IndexNow

最有意思的是这个 URL:

Plaintext
https://www.shuijingwanwq.com/2026/07/05/18875/

它正好就是前一天我用来测试:

Plaintext
新 Key 是否已经从 202 变成 200

的那个 URL。

而现在 Bing Webmaster Tools 中显示:

Plaintext
来源:Self

所以这条记录可以比较明确地对应到我自己的直接提交。

也就是说:

Plaintext
自己调用 IndexNow
→ API HTTP 200
→ 后来 Dashboard 最终出现
→ Source = Self

至少这一条确实对应上了。


九、但我现在仍然不确定“自己直接全量提交”到底起了多大作用

这里也是我现在比较纠结的地方。

因为前一天我并不是只提交了一个 URL。

后来已经把:

Plaintext
www.shuijingwanwq.com
3347 个 URL

和:

Plaintext
en.shuijingwanwq.com
3348 个 URL

都做过完整的 IndexNow bulk submission。

接口结果也是:

Plaintext
HTTP 200

但到了 Bing Webmaster Tools 中,目前我能够非常明确看到的 Self evidence,反而只有前面那个测试 URL。

这就让我不太确定:

Bulk submission 的几千个 URL 到底有没有全部进入 Bing 的处理链?

从 API 协议角度看,它们已经返回成功。

但从 Bing Webmaster Tools Dashboard 的可见数据来看,目前还无法通过后台把这几千个 URL 一一对应出来。

所以现在我会把两个结论分开。

接口层:

Plaintext
HTTP 200
= IndexNow endpoint 已接受这次提交

Dashboard 层:

Plaintext
不保证实时显示
也不保证马上把 bulk submission 全部展示出来

因此直接提交我仍然会保留,但不会再认为:

一旦得到 200,Bing Webmaster Tools 马上就应该出现几千条记录。

这次实际情况证明不是这样。


十、Cloudflare Crawler Hints 的表现反而非常明显

真正让我觉得“这东西确实开始工作了”的,是英文站。

打开:

Plaintext
en.shuijingwanwq.com

可以看到:

Plaintext
过去 3 小时提交的 URL:565
来源:Cloudflare
图 3:英文站 3 小时内出现 565 个 Cloudflare 来源 URL
图 3:英文站 3 小时内出现 565 个 Cloudflare 来源 URL
Bing IndexNow Cloudflare 565 URLs

这和自己直接提交形成了非常明显的反差。

自己提交:

Plaintext
API 200
→ Dashboard 很久不显示
→ 后来只明确看到少量 Self evidence

Cloudflare:

Plaintext
Crawler Hints 开启
→ 很快开始出现大量记录
→ Source 直接显示 Cloudflare

至少从 Bing Webmaster Tools 的可观察结果来看:

Cloudflare Crawler Hints 的效果明显得多。


十一、Cloudflare Crawler Hints 的配置其实非常简单

Cloudflare 这一边,我做的事情并不复杂。

直接在对应 Zone 中开启:

Plaintext
Crawler Hints

即可。

图 4:Cloudflare Crawler Hints 已开启
图 4:Cloudflare Crawler Hints 已开启
Cloudflare Crawler Hints

开启以后,Cloudflare 会根据它在 CDN 层观察到的页面变化,向搜索引擎提供 URL 更新提示。

而 Bing Webmaster Tools 现在直接把这些记录标记成:

Plaintext
Cloudflare

所以至少从结果上看:

Plaintext
Cloudflare Crawler Hints
→ IndexNow ecosystem
→ Bing Webmaster Tools

这一条链路已经真正跑起来了。


十二、日语站也开始不断出现 Cloudflare 提交

这种现象并不是只出现在英文站。

日语:

Plaintext
ja-go-dev.shuijingwanwq.com

同样已经开始显示:

Plaintext
来源:Cloudflare
图 5:日语站的 Cloudflare IndexNow 记录
图 5:日语站的 Cloudflare IndexNow 记录
Japanese Go Tour IndexNow Cloudflare

例如已经出现:

Plaintext
/pkg/io/
/tour/basics/16
/tour/methods/17
/tour/flowcontrol/7
/tour/concurrency/6

而且时间还在不断更新。

这说明 Cloudflare 并不是一次性把几个固定 URL 提交以后就结束了。

它会持续根据站点变化产生新的 hints。


十三、德语站同样如此

德语:

Plaintext
de-go-dev.shuijingwanwq.com

也开始显示 Cloudflare 来源。

图 6:德语站的 Cloudflare IndexNow 记录
图 6:德语站的 Cloudflare IndexNow 记录
German Go Tour IndexNow Cloudflare

能看到:

Plaintext
/pkg/fmt/
/doc/
/tour/methods/13
/tour/methods/21
/tour/

等不同页面。

因此目前至少可以确认:

Plaintext
en
ja
de

多个经过 Cloudflare 的站点,都已经出现真实的 Cloudflare IndexNow activity。

这已经很难用单站偶发现象解释了。


十四、反过来看中文 Go Tour,仍然还是 Get Started

这个对比特别有意思。

英文、日语、德语已经大量出现:

Plaintext
Source = Cloudflare

但中文 A Tour of Go:

Plaintext
go-dev.shuijingwanwq.com

目前依然还是:

Plaintext
Get Started

中文 Go Tour 和其他语言站有一个重要区别:

Plaintext
中文:
EdgeOne

非中文多个 locale:
Cloudflare

所以中文站本身不会经过 Cloudflare Crawler Hints 这条链路。

这至少可以解释:

为什么其他语言站已经不断出现 Cloudflare 来源,而中文站完全没有这种记录。

但这仍然不能说明:

中文站之前的直接 IndexNow 提交没有作用。

因为直接提交接口确实成功返回过 200。

只是目前 Bing Webmaster Tools 还没有提供足够明显的 Dashboard evidence。


十五、所以现在我怎么看“直接提交”和“Cloudflare Crawler Hints”

经过这次实测以后,我现在会把它们看成两个层次。

第一次上线:自己做完整 bootstrap

对于新语言站,我仍然会主动做一次全站 IndexNow bootstrap。

原因是它能明确把当前正式 Sitemap 中的 URL 主动通知出去。

流程是:

Plaintext
production_state=live
→ 验证 Key
→ 获取 sitemap
→ homepage probe
→ 202 则等待
→ 200 后 bulk submit

这相当于:

新站刚上线时,主动告诉 IndexNow 生态“这些页面现在都存在”。


后续正常变化:交给 Cloudflare Crawler Hints

新站第一次 bootstrap 完成以后,我不会周期性地把整个网站重新提交一遍。

对于走 Cloudflare 的语言站,后续更多依靠:

Plaintext
Sitemap
+
Cloudflare Crawler Hints

目前从 Bing Webmaster Tools 的实际表现来看,Crawler Hints 的存在感甚至比我的手工 bulk submit 强很多。


十六、最后把 IndexNow bootstrap 做成了正式 Go CLI

手工测试几轮以后,每增加一门语言都重复执行:

Plaintext
找 hostname
→ 生成 Key
→ 验证 Key
→ 读取 Sitemap
→ 校验 URL
→ probe
→ 等 202
→ 再 probe
→ bulk submit

实在比较繁琐。

所以最后直接把 IndexNow bootstrap 做进了 A Tour of Go 多语言项目的正式 Go CLI。

现在新 locale 最后只需要执行:

Bash
go run -mod=readonly ./cmd/tour-i18n indexnow bootstrap \
  --locale <locale> \
  --key-file /secure/path/<key>.txt

程序会自动:

Plaintext
读取 production/identity.json
→ 只接受 production_state=live
→ 验证公网 root key
→ 获取正式 /sitemap.xml
→ 校验 HTTPS
→ 校验 hostname
→ 拒绝重复 URL
→ sitemap URL 数量 1..10000
→ homepage probe
→ 202 时停止等待
→ 200 后提交剩余 N-1
→ submitted_urls=N

最后还拿意大利语站做了真实 production smoke:

Plaintext
IndexNow bootstrap: PASS
locale=it-IT
sitemap_urls=105
submitted_urls=105

从此以后,新增加一门语言的最终搜索引擎 closeout 也固定下来:

Plaintext
Google Search Console
→ Bing Webmaster Tools
→ locale-specific search engine
→ IndexNow bootstrap

十七、为什么我还是会保留自己的 IndexNow bootstrap

看到 Cloudflare 这么快以后,其实很容易产生一个问题:

既然 Cloudflare Crawler Hints 已经这么积极,还有没有必要自己做一次全站提交?

我现在的答案仍然是:

有必要,但只做一次。

因为两者职责并不完全一样。

自己做 bootstrap:

Plaintext
新站上线
→ 当前 Sitemap 的全部正式 URL
→ 一次性主动通知

Crawler Hints:

Plaintext
网站后续运行
→ Cloudflare 观察到变化
→ 持续提供 URL hints

而且不是所有站都一定使用 Cloudflare。

像中文 A Tour of Go 目前走的就是 EdgeOne。

因此项目自身拥有一个不依赖特定 CDN 的标准 IndexNow bootstrap,还是有意义的。


十八、IndexNow 对我最大的价值,并不只是 Bing

一开始研究 IndexNow,我主要看的还是 Bing。

但做完以后,我觉得它真正吸引我的地方其实是:

一次提交,可以增加被多个支持 IndexNow 的搜索引擎发现的机会。

Google 和百度目前还是各走自己的发现、抓取和提交流程。

但除此之外,互联网上还有很多规模更小的搜索引擎。

如果它们支持 IndexNow,我就没有必要为了每一家:

Plaintext
单独注册站长平台
→ 单独验证域名
→ 单独提交 Sitemap
→ 再单独维护

我的多语言站点仍然可能通过 IndexNow 获得额外的 URL discovery 机会。

对于几十门语言这种规模来说,这种“一次标准化接入,覆盖更多搜索渠道”的价值会越来越明显。

哪怕最后只多带来一小部分长尾流量,也是额外收益。


十九、这次折腾以后,我得到的几个结论

第一,新 Key 第一次出现:

Plaintext
HTTP 202

不用急着换 Key。

等待 validation 后再试即可。

第二:

Plaintext
HTTP 200

仍然是我判断 IndexNow 接口提交成功的主要 machine evidence。

第三,不要期待 Bing Webmaster Tools Dashboard 实时反映接口结果。

我已经真实遇到过:

Plaintext
API 早就 200
→ Dashboard 长期 Get Started

甚至专门重新做干净实验以后也是如此。

第四,后来 Dashboard 确实开始显示 Self 记录,所以自己直接提交不是完全没有 evidence。

但目前我仍然无法从 Dashboard 证明:

前一天自己 bulk submit 的所有几千个 URL 都已经逐条显示。

第五,Cloudflare Crawler Hints 的效果非常直观。

英文站一度显示:

Plaintext
过去 3 小时:565
Source:Cloudflare

日语、德语站也在持续产生 Cloudflare 来源记录。

第六,目前从 Bing Webmaster Tools 的“可见结果”来看:

Cloudflare Crawler Hints 比自己的直接提交明显得多。

至于是不是 Cloudflare 实际处理得更快,还是 Bing Dashboard 对 Cloudflare 来源的 reporting 更及时,目前没有足够 evidence 可以下结论。

第七,IndexNow 并不能保证索引。

它解决的是:

Plaintext
主动通知
→ 增加发现机会
→ 增加抓取机会

最终是否进入索引还是搜索引擎自己的判断。

但对于我的多语言项目来说,还有另外一层意义:

越多支持 IndexNow 的搜索引擎能够发现这些页面,就越有机会获得来自不同国家、不同搜索引擎的一部分长尾流量。

这也是我最终决定把 IndexNow 正式加入新 locale 上线流程的主要原因之一。

GSC → Bing Webmaster Tools:多语言站点如何减少重复验证

A Tour of Go 多语言翻译项目

本系列完整记录 A Tour of Go 多语言翻译项目从架构设计、整页翻译、结构保护、自动校验,到生产发布与后续维护的实际开发过程。

项目入口:
✅ 简体中文:A Tour of Go 简体中文版
✅ 日语:A Tour of Go 日语版
✅ 德语:A Tour of Go 德语版
✅ 法语:A Tour of Go 法语版
✅ 项目源码:GitHub:shuijingwan/go-tour-i18n

当前已上线简体中文、日语、德语和法语版本。项目属于非官方社区多语言翻译项目,与 Go 官方无隶属或授权关系。