给站群做收录提交这件事,我们踩过的坑不多,但都踩得很实。挑两个跟百度有关的说,一个在参数上,一个在规则上。
参数上:site 不能做 URL 编码
往百度的普通收录接口推 URL,请求里的 `site` 参数要填你的站点。这个参数必须原样给,写成 `site=https://example.com` 就行。
我们当时手一抖,把它做了一次 URL 编码。接口返回 400,报 `site init fail`。
排查了半天才反应过来,它不解码。编码之后那串字符在它眼里不是站名,是一个不认识的字符串。看起来更规范的写法,在这里反而是错的。
这个错误我们犯了两次。头一回改好了,隔了几天写新脚本的时候又写进去了,因为它长得很像「应该被编码」的样子。
所以如果你写的是通用提交函数,记得给 `site` 单独留一条不带编码的路,别顺手跟其他参数一起处理。
规则上:能不能收,看的是两个条件
关于这个接口,网上流传的说法是「token 绑定域名」。我们实测下来,这个说法不准确,会让人绕远路。
10 月 5 日那天我们拿四种组合跑了一遍,结论是每次调用同时看两件事:
`site` 必须是你百度账号里已经添加并且验证过的站点。token 本身是账号级的,一个账号一个 token,不绑具体域名。
你提交的 URL 的 host,必须和 `site` 完全一致。
四种组合跑出来是这样:
`site` 填站群主域,推主域首页,通过。
`site` 填官网主域,推官网页面,通过。
`site` 填不带 www 的裸域,推带 www 的地址,返回 `not_same_site`。这就是 host 不一致。
`site` 填某个城市子域,推该子域的页面,返回 401 `site error`。原因是这个子域压根没在账号里注册过,前面那条就不满足。
之前我们还误判过一次,把 `not_same_site` 解释成「百度不接收子域名」。查清楚之后才发现,真实原因是 host 没对上,跟子域本身没关系。
这两条对我们的做法有什么影响
如果手上是一个主域加一堆子域的站群,最省事的做法不是给每个子域单独注册再去推。
每个子域都要在站长平台单独添加并验证,验证文件还得一个个放上去,维护成本会随着站数线性上涨。
我们最后走的是另一条路:把主域的 sitemap 做成索引文件,里面列出各个子域的 sitemap。提交一次主域的索引,搜索引擎顺着往下抓,各子域的 sitemap 自然会挨个被取走。这套我们实测是通的。
顺带一句,主域本身的推送也别浪费。主域的页面链着全部子站,百度重抓主域一次,就多一次发现子站的机会。
边界
上面这些只对百度的普通收录接口成立。Bing 和 IndexNow 是另一套规则,别混用。
另外,`site` 参数虽然不能编码,URL 本身还是要正常编码的,这两处别一起改错。
提交收录是 GEO 里最靠后,也最容易被忽略的一环。内容做得再好,页面进不了索引,等于没写。桐灼在给客户做交付的时候会把这一环单独列出来验收,就是因为它出问题的时候,前面所有工作都看不出来。