博客被 Bing 除名,我是怎么救回来的
昨天在 Bing 上搜自己的博客,site:blog.puber.top,一条结果都没有——压根没被收录,谈不上排名。

博客 9 月底因为服务器过期下线过一次,搜索引擎把索引清了;10 月初重新部署上线,我在 Bing 站长工具里提交了收录申请,然后就干等。等了一天多,越想越不对,去站长工具里做了个 URL 检查,结果页上写着 "URL cannot be indexed by Bing"——这个 URL,Bing 不给收录。
下面还有一行小字,说检测到 canonical 标签指向了首页。按 canonical 的规则,我这篇文章会被判定为首页的"重复版本",不配拥有索引。
全站的 canonical 都被写死了
我 curl 拉了一下文章页的源码。
<link rel="canonical" href="https://blog.puber.top/" />
一篇文章,canonical 却指向首页。再看首页、归档页,清一色指向首页。全站所有页面的 canonical 都被写死成了根域名。
canonical 是告诉搜索引擎"这个页面真正的标准地址是哪个"的标签。全站的 canonical 都指向首页,等于告诉搜索引擎这几十个页面都是首页的重复页。结果就是只收录首页,文章页一篇都进不来。
根因在主题里。我用的是 Halo 的 Joe3 主题,templates/modules/link.html 第 12 行。
<link rel="canonical" th:href="${site.url}" />
作者图省事,${site.url} 一把梭,不管什么页面,canonical 永远是站点地址。这种 bug 页面上看不出任何异常,只有搜索引擎看得见,标准的静默杀手。
差点换了主题
第一反应是这主题不行,换一个吧。
于是去 GitHub 把几个热门 Halo 主题的 head 模板翻了个遍,grep canonical 做排查,Hao、Sakura、Cosolar、Higan、Stellar、Aurora 这 6 个全干净,只有 Joe3 有这个坑。
中间还试了 Clarity,结果它埋了另一个雷,模板里用 ${site.url + post.status.permalink} 直接字符串拼接,我后台"站点地址"末尾带了个斜杠,拼出来就是 https://blog.puber.top//archives/...——双斜杠。Bing 照样报 cannot be indexed。我一开始以为双斜杠无所谓,后来才搞明白,Bing 不做 URL 归一化,//archives/ 和 /archives/ 在它眼里是两个不同的地址,canonical 对不上,等于没修。
折腾一圈想明白了,换主题要重配一堆东西,风险更大。不如不动主题,只修这一行。
一行代码的事
把第 12 行改成这样。
<link rel="canonical" th:href="${post != null ? post.status.permalink : (singlePage != null ? singlePage.status.permalink : site.url)}" />
改完的逻辑很直白,文章页用文章自己的链接,单页用单页的链接,首页、归档页这些才回退到站点地址。
只改这一个文件,打了个补丁包,后台"外观 → 主题 → 安装 → 上传",启用。curl 再验,文章页 canonical 指向自己了,首页还是首页,双斜杠也没了。
让 Bing 重新认识我
回 Bing 站长工具重新做 URL 检查,变绿了,"URL can be indexed by Bing"——这个 URL 可以收录了。顺手点了 Request indexing,请求收录。
但 Request indexing 是一次性的。想以后每发文章 Bing 第一时间知道,可以接 IndexNow。
IndexNow 是什么
IndexNow 是微软和 Yandex 牵头搞的协议,Bing、Yandex 都认。网站有更新就往 api.indexnow.org 推一次,各家搜索引擎各自来抓,不用干等爬虫上门。
Halo 配置实录
我用的是 Halo 应用市场里 acanyo 的 IndexNow 插件,第三方插件,作者就是 Clarity 主题的作者,Halo 官方没出过这东西。不过它上架了官方应用市场,代码开源,功能只有一个,就是推送 URL,风险不大。
第一步,生成 key
key 不用申请,自己编一个 8~128 位的十六进制串就行,比如用 openssl 生成。
openssl rand -hex 32
第二步,装插件填设置
应用市场搜 IndexNow 安装,设置里就两项。
- siteUrl:
https://blog.puber.top(末尾别带斜杠,前面双斜杠的坑就是这么来的) - indexNowKey:把上一步生成的串填进去,保存
第三步,证明这个网站是你的
Bing 认的是你网站根目录下的 {key}.txt,内容必须就是 key 本身,对上了才认你是站长本人。
插件会在服务器 ~/.halo2/static/ 下自动生成这个文件,但有个坑,Halo 的反向代理只映射了 /static/**,根目录的 /{key}.txt 不一定能访问到。兜底办法是给 nginx 加一条精确匹配规则。
location = /{key}.txt { return 200 '你的key'; }
然后 curl https://blog.puber.top/{key}.txt,返回 200 且内容对得上,就算通了。
第四步,确认推送成功
去控制台更新一篇文章,插件的"推送日志"里会出现一条记录,绿点就是成功。我这边更新了一篇文章,一次推送成功。从此以后每发文章自动推,不用再看爬虫脸色。
三句话总结
- 收录出问题,先去站长工具做 URL 检查,看返回结果说什么,别干等爬虫。
- canonical 是静默杀手,页面看着一切正常,搜索引擎眼里你全站都是重复页。
- 能打补丁就别换主题,一行代码解决的事,没必要把整套东西掀了。
后续
这篇写于 2026-10-12,修是修完了,Bing 那边还没动静,site:blog.puber.top 依然是空白,开头的截图就是刚截的。Request indexing 点了,IndexNow 也在推,剩下的就是等,几小时到几天不等。
收录恢复那天,我会回来更新这篇的后续。
评论区