我让 AI 给自己的博客做了次 SEO 体检

博客 SEO 体检

几天前我用一句话让 AI 搭了这个博客,从需求到域名解析大概四分钟。写了几篇之后我想起一件事:它跑得起来,不代表它被人看得见。

于是我让 AI 做了一次完整的 SEO 体检。结果有点出乎意料。真正该修的东西,和大家一提 SEO 就想到的关键词、外链、密度,一个都不沾边。

体检结果:三个真问题

一、分享出去,是一条光秃秃的蓝链接

这是最可惜的一项。我每篇文章都认真做了题图,但 <head> 里一个 Open Graph 标签都没有。

后果是发到微信、Telegram、Twitter、Slack,全都只显示一行标题加一个链接,图一张都不出现。图早就做好了,躺在服务器上,只是没人告诉浏览器它们的存在。

对个人博客来说,社交预览图的实际影响比传统 SEO 大。你的读者九成是从别人转发的链接点进来的,不是从搜索引擎。

二、12MB 的图片

public/images/ 一共 12MB,最大的单张封面 2.78MB。

题图恰好是每篇文章的 LCP 元素,也就是首屏最大内容,而 LCP 是 Google 明确列出的排名信号。手机上下载 2.8MB,进度条能转好几秒。

我让它试了三种格式,同一张图:

格式体积变化
原 PNG2778 KB
JPEG q82516 KB−81%
WebP q82205 KB−93%

全站转 WebP 之后:

12216 KB  →  681 KB      省 95%

肉眼看不出任何差别。这些插画都是大色块,正是 WebP 最擅长的类型。这也是唯一一项能被 PageSpeed 分数直接量到的改动。

三、<html lang="en">,但整站是中文

模板里写死的。搜索引擎靠这个判断语言和投放地区,标错会影响中文搜索的可见度,浏览器也会莫名其妙弹出「翻译此页」。

改一个词的事,但没人告诉你,你就一直错着。

顺手补齐的基础件

这几样属于没有不会死,但没有就是不专业:

  • sitemap.xml:装 @astrojs/sitemap,配置里加一行
  • robots.txt:之前压根不存在,顺带指向 sitemap
  • canonical:告诉搜索引擎哪个是正版 URL
  • JSON-LD 结构化数据BlogPosting,影响搜索结果里能否显示日期和作者
  • RSS:严格说不算 SEO,但技术博客的读者习惯订阅

还有个低级疏漏:首页没写 description,回落到了模板自带的那句英文默认值。而首页恰恰是最常被索引的页面。

两个我自己踩到的坑

这部分比上面的清单更值得看,因为它们都是「做了 SEO 反而做出问题」的那类。

坑一:canonical 和 sitemap 打架

我最初生成的 canonical 是这样的:

https://ohmyself.com/blog/foo

但 sitemap 和站内链接用的是带尾斜杠的版本:

https://ohmyself.com/blog/foo/

这等于我亲手给同一个页面制造了两个 URL 版本。canonical 的全部意义就是消除重复 URL,结果它自己成了重复的来源。

搜索引擎看到的是:网站地图说这个地址是 A,页面自己说「我的正版是 B」。权重被劈成两半,比压根不写 canonical 还糟。

教训是 canonical、sitemap、站内链接三者的尾斜杠必须一致,写完拿构建产物比对一遍,别靠脑补。

坑二:差点写了假的图片尺寸

og:image:widthog:image:height 能让社交平台在图下载完之前就把位置留好。我一开始给所有页面都写死了 1672×941

问题是没有封面的文章会回落到默认卡片,而那张是 1200×630。一部分页面的元数据是假的。

最后我把这两个标签直接删了,平台自己会读图。错的元数据比没有元数据更糟,这条对整个 SEO 都成立。

顺手做的两件小事

给图片自动补 width/height。 Markdown 里的 ![]() 生成的是裸 <img>,没有尺寸,图片加载完会把下面的文字往下挤,这是 CLS,另一项 Core Web Vitals。写了个构建期插件自动读文件尺寸填进去,以后新图不用管。

首图 eager,其余 lazy。 封面是 LCP 元素,给它 loading="eager"fetchpriority="high",正文里的截图给 loading="lazy"。给封面图无脑加 lazy 是个常见的反向优化,它恰恰是最该抢着加载的那张。

改完的样子

项目改前改后
图片总体积12 MB681 KB
分享卡片og + twitter 大图
<html lang>enzh-CN
canonical全站有,与 sitemap 一致
sitemap / robots / RSS全无全有
结构化数据BlogPosting
图片尺寸属性无(会抖动)构建期自动补

最后一步,也是最容易被忘的一步

改完之后我做了一件事:把这些规矩写进了 AGENTS.md

因为所有这些设置都有一个共同的失效方式。下次加新文章、换个模板、或者让 AI 改点别的东西时,它们会悄悄回到原样。你不会收到任何报错,只会在三个月后偶然发现分享出去又没图了。

我写进去的大概是这些:

## SEO
- Layout.astro 统一输出 canonical、Open Graph、Twitter Card 与 JSON-LD
- canonical 与 sitemap 一律使用结尾带斜杠的 URL,勿改成不带斜杠
- 配图一律存 WebP;width/height 由构建期插件自动补,无需手写
- 无封面的页面回落到 og-default.webp

之前那篇讲 AGENTS.md 的文章里我说过,它的价值是让 AI 从「通用聊天机器人」变成「懂你项目的队友」。这次是个很具体的例子。这些规则不写下来,下一个动这个仓库的人(很可能就是 AI)没有任何办法知道尾斜杠这种事。

一份可以照抄的清单

如果你也有个静态博客,按这个顺序检查:

  1. 随便找篇文章,把链接发到微信或者 Telegram,看有没有出现图。没有就去补 og 标签
  2. 看一眼 public/ 或图片目录总共多大,超过 2MB 就该转 WebP 了
  3. 打开页面源码,看 <html lang="..."> 和你的正文语言对不对
  4. 访问 你的域名/sitemap.xml/robots.txt,404 就是没有
  5. 有 canonical 的话,和 sitemap 里的写法比一比尾斜杠
  6. 首页的 description 是不是还是模板自带的那句

六条里前两条最要紧,加起来大概二十分钟,收益占八成以上。

最后说句实在的:这篇没有「流量涨了多少」的数据可以给你看,因为改完到现在才几个小时,搜索引擎重新抓取要好几周。任何一篇上线当天就告诉你流量翻倍的 SEO 文章,你都可以直接关掉。

我能确定的只有这些:图片小了 95%,分享出去有图了,语言标对了,该有的文件都有了。剩下的过几周再看。