事情本身不复杂,线索都在日志里。key 生成工具给的是 32 位十六进制,脚本里为了统一风格做了 upper 处理,提交时 key 和文件名一个全大写一个全小写,接口稳定返回 403,换成原样立刻就过了。
第一反应是「脚本对 key 做了 trim 之外的格式化,前后空格也被去掉」,验证下来不成立。
把日志和配置对完,能解释这个现象的基本就这几处。接口按字节比对 key 与文件名,大小写不同视为不匹配。另一种情况是文件名在大小写不敏感的文件系统上能读到,掩盖了差异。
少数情况下是反向代理把 URL 路径统一转成小写,文件名和请求路径对不上。
第一件事是比对提交值、URL 路径和磁盘文件名的实际字节
echo -n '8F3A2C' | md5sum; ls /var/www/example/ | grep -i 8f3a2c
去掉所有格式化,按原值提交
curl -s 'https://api.indexnow.org/indexnow?url=https://www.example.com/post/1024&key=8f3a2c9b7d6e5f4a3b2c1d0e9f8a7b6c'
随后确认 Nginx 没有改写路径大小写
curl -sI https://www.example.com/8f3a2c9b7d6e5f4a3b2c1d0e9f8a7b6c.txt | head -1
末了在配置里固定 key 常量不再做格式化
grep -n 'upper()\|lower()' push_indexnow.py
恢复的判定其实很直接。按原值提交返回 200,key 文件访问也返回 200 且字节一致,后台提交记录里不再出现 403。
文件名和 key 值必须完全一致,大小写不敏感的环境会让这个错误在本地永远复现不出来。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
