站点有中文标签聚合,地址形如 /tag/前端工程/,推送脚本把这些字符串直接拼进 JSON,接口返回 400,错误信息只写了「Invalid request」。换英文标签再推就正常,问题出在地址本身。
真正麻烦的地方在于,几个原因的现象几乎一样。JSON 里保留原始中文,接口按 URI 规范校验直接拒绝;空格没转成 %20,被处理成加号后与服务器路由对不上;全角括号和斜杠混在路径里,规范化结果与线上地址不同;提交前没做 URL 解析,相对地址也被直接塞进去。
先用一条中文地址单独试提交
curl -s -o /dev/null -w '%{http_code}\n' -X POST https://api.indexnow.org/indexnow -H 'Content-Type: application/json' -d '{"host":"www.example.com","key":"xxx","urlList":["https://www.example.com/tag/%E5%89%8D%E7%AB%AF/"]}'
接着看线上中文路径实际被编码成什么
curl -sI 'https://www.example.com/tag/前端/' -o /dev/null -w '%{url_effective}\n'
脚本里统一编码后再拼请求体
python -c "import urllib.parse;print(urllib.parse.quote('/tag/前端', safe=':/'))"
批量前抽 20 条验证编码结果
python push.py --sample 20 --dry-run
改完先别撤,确认这几项。同一批中文标签地址返回 202,必应日志里出现对这些编码地址的抓取,标签页索引量开始上涨。
提醒一点。服务器能认中文不代表接口能收,地址在提交前必须先规范化,这是两个环节。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
