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

几天前我用一句话让 AI 搭了这个博客,从需求到域名解析大概四分钟。写了几篇之后我想起一件事:它跑得起来,不代表它被人看得见。
于是我让 AI 做了一次完整的 SEO 体检。结果有点出乎意料。真正该修的东西,和大家一提 SEO 就想到的关键词、外链、密度,一个都不沾边。
体检结果:三个真问题
一、分享出去,是一条光秃秃的蓝链接
这是最可惜的一项。我每篇文章都认真做了题图,但 <head> 里一个 Open Graph 标签都没有。
后果是发到微信、Telegram、Twitter、Slack,全都只显示一行标题加一个链接,图一张都不出现。图早就做好了,躺在服务器上,只是没人告诉浏览器它们的存在。
对个人博客来说,社交预览图的实际影响比传统 SEO 大。你的读者九成是从别人转发的链接点进来的,不是从搜索引擎。
二、12MB 的图片
public/images/ 一共 12MB,最大的单张封面 2.78MB。
题图恰好是每篇文章的 LCP 元素,也就是首屏最大内容,而 LCP 是 Google 明确列出的排名信号。手机上下载 2.8MB,进度条能转好几秒。
我让它试了三种格式,同一张图:
| 格式 | 体积 | 变化 |
|---|---|---|
| 原 PNG | 2778 KB | — |
| JPEG q82 | 516 KB | −81% |
| WebP q82 | 205 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:width 和 og: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 MB | 681 KB |
| 分享卡片 | 无 | og + twitter 大图 |
<html lang> | en | zh-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)没有任何办法知道尾斜杠这种事。
一份可以照抄的清单
如果你也有个静态博客,按这个顺序检查:
- 随便找篇文章,把链接发到微信或者 Telegram,看有没有出现图。没有就去补 og 标签
- 看一眼
public/或图片目录总共多大,超过 2MB 就该转 WebP 了 - 打开页面源码,看
<html lang="...">和你的正文语言对不对 - 访问
你的域名/sitemap.xml和/robots.txt,404 就是没有 - 有 canonical 的话,和 sitemap 里的写法比一比尾斜杠
- 首页的 description 是不是还是模板自带的那句
六条里前两条最要紧,加起来大概二十分钟,收益占八成以上。
最后说句实在的:这篇没有「流量涨了多少」的数据可以给你看,因为改完到现在才几个小时,搜索引擎重新抓取要好几周。任何一篇上线当天就告诉你流量翻倍的 SEO 文章,你都可以直接关掉。
我能确定的只有这些:图片小了 95%,分享出去有图了,语言标对了,该有的文件都有了。剩下的过几周再看。