新站上线把 5 万条 URL 一次性推给 IndexNow,接口返回 200,脚本就打了成功日志。两周后必应只抓了几百条,翻开响应体才发现 invalid 字段下挂着两万多条地址,reason 写的是「Url not in domain」。

一开始怀疑是「部分 URL 是 301 前的老地址,已被规则映射到新路径」,查了一圈,方向不对。

排查方向其实有限,先把可能性排一排。提交的主机名与 key 文件所在主机不一致,跨域地址一律判 invalid。也可能是地址里带中文没有做百分号编码,格式校验过不去。

不容易想到的是,路径里有大写字母,与规范化后的地址不同。

上来先把响应体里的 invalid 段落单独抽出来看

curl -s -X POST https://api.indexnow.org/indexnow -H 'Content-Type: application/json' -d @body.json | python -m json.tool | head -40

接着按主机名分组统计无效地址数量

python check.py --host www.example.com

中文路径先编码再拼进请求体

python -c "import urllib.parse;print(urllib.parse.quote('/tag/前端', safe='/'))"

只推返回 200 的地址

curl -s -o /dev/null -w '%{http_code}\n' https://www.example.com/p/1

改完先别撤,确认这几项。第二次提交后 invalid 列表为空,48 小时内必应抓取日志里这批地址的请求数明显上来。

接口回 200 只代表请求收下了,逐条结果都在响应体里,脚本必须解析这个字段。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189