博客的 RSS 如何导致 SEO 异常
一年半之前,也就是站点运行起来不久,笔者曾经修复了站点RSS无法正常工作的问题,当时也写文章记录了下来。那次维修之后,RSS可以正常使用了,就没再去管他。
不过似乎就是从那个时候开始,Google Search Console(下面简称GSC)里面就冒出来了大量的『网页会自动重定向』链接,虽然(可能)不影响索引,但是看着也不舒服。这次下决心排查了一会儿,最后成功揪出来,是一年半之前的维修导致的这个故障。
问题在于,谁能第一时间想到这两件事能产生关系呢?
前言
这篇可以算是博客装修记的续集(也有可能是这个系列里面的新一集)。
其实我在考虑要不要单开一个系列,因为博客虽然是基于Typecho + Waxy主题,但实际上安装好之后,笔者也是在断断续续给他们俩打Patch,所以本质上本站运行的这套程序是部分的魔改版——毕竟是基于PHP以及普通网页前端,直接改就行了。按照开源协议规定,修改了源代码之后需要把源代码公布出来,但是因为很多修改内容都是迎合自己的使用习惯,所以就没有往上游推了,就在这里记录一下。
故障现象
本站的链接格式,应该如下所示:
https://blog.mfwt.top/index.php/archives/<ID>/
但根据GSC后台反馈来看,他们大量抓取到了形如这样的链接:
https://blog.mfwt.top/archives/<ID>/

虽然从服务器配置上来说,后者会自动做301到前者,所以访问哪个链接都可以,但是本质上这种还是治标不治本的办法。感觉如果现在不修,以后Patch打多了就难找问题何在了,于是赶紧动手。
排查之一
首先第一反应,检查页面上是否有提供此类链接的地方(为什么不是第一时间在GSC后台找referer,下面会说)。搜索引擎爬虫在爬取结果的时候,主要就是固定找那几个结果,例如<a>
标签的href
字段之类的。于是在询问ChatGPT之后,他给出了下面的代码,在开发者控制台中执行,检查可能爬取的点:
const links = new Set();
// <a href>
document.querySelectorAll('a[href]').forEach(el => links.add(el.href));
// <link href>
document.querySelectorAll('link[href]').forEach(el => links.add(el.href));
// <meta content>
document.querySelectorAll('meta[content]').forEach(el => {
const val = el.content;
if (val.startsWith('http')) links.add(val);
});
// JSON-LD 链接(结构化数据)
document.querySelectorAll('script[type="application/ld+json"]').forEach(script => {
try {
const json = JSON.parse(script.textContent);
const collectLinks = obj => {
for (const key in obj) {
const val = obj[key];
if (typeof val === 'string' && val.startsWith('http')) {
links.add(val);
} else if (typeof val === 'object' && val !== null) {
collectLinks(val);
}
}
};
collectLinks(json);
} catch (e) {}
});
// <img src>
document.querySelectorAll('img[src]').forEach(el => links.add(el.src));
// <iframe src>
document.querySelectorAll('iframe[src]').forEach(el => links.add(el.src));
// 输出所有链接
console.log(Array.from(links));
稍微扫了一眼,并没有发现有哪个地方提供这种样式的链接。然后又切换到文章页,分类页,归档页等地方,分别执行这个代码进行检查,最后也还是没有发现会产生此类链接的地方。
排查之二
此时就隐隐约约感觉到,GSC作为一个成熟工具,应该有能显示抓取来源的地方。
现在解释一下为什么一开始不是在考虑这个:GSC后台显示问题的时候,并不会马上展示详细信息,只会孤零零地展示一个大片空白的侧边弹窗。你得点击『网址检查』按钮,或者复制链接到上面的搜索框,去查找具体问题所在。
这一查,就查出问题来了:

引荐来源显示,这条链接是从Atom来的(本质上还是类似RSS的技术,所以就简称RSS了)。尝试在浏览器里面直接打开RSS链接,然后Ctrl+F搜索关键词,果然找到了猫腻:

对于Typecho来说,说到RSS相关的东西,那自然就得到var/Widget/Feed.php
去修改内容了。其实分析到这个地方,就基本上能猜测出来,可能是一年多之前的问题引发的。因为当时修RSS的时候,对于getFeedUrl()
函数的处理方式是直接替换为站点的地址。本着死马当活马医的态度,尝试在原来的地址后面补上一个index.php/
,让他成为正确的地址:

保存,刷新,就查询不到错误链接了。剩下的事情交给时间,如果还有类似错误,就继续排查。
写在最后
水文章一篇,但是确实学到了东西。
比如,知道了现在的搜索引擎还会用RSS来起到类似Sitemap的作用。
(完)