很多人搭完博客就开始狂写文章,结果发现搜索引擎迟迟不收,Google Search Console 里抓取覆盖率惨不忍睹。更惨的是,现在 AI 搜索(Google SGE、秘塔、Kimichat)越来越普及,传统搜索引擎带来的流量占比在下降,如果你的网站没有被 AI 搜索引擎吃透,相当于白白少了一大批读者。
这篇文章我用本站 Hexvork 的实际配置为例,一条龙服务,把 Sitemap 和 LLMs.txt 的自动生成方案讲明白。折腾一次,后面发文章就全自动了,一劳永逸。
Sitemap 和 LLMs.txt 的作用
Sitemap 是给传统搜索引擎看的”网站地图”。你告诉 Google、百度你的网站有哪些页面、哪个页面最新、哪个最需要优先抓取。没这个,搜索引擎只能靠链接摸黑爬你的网站,慢不说,还可能漏掉深层页面。
LLMs.txt 是给 AI 看的”网站说明书”。这是 llmstxt.org 搞出来的新标准,主要面向 ChatGPT、Claude、Kimi 这类大模型。相当于把你的网站内容打包成 Markdown 格式,让 AI 能快速理解你的网站讲了什么、有哪些有价值的内容。这玩意就是 GEO(Generative Engine Optimization,生成式引擎优化)的核心武器。
一、Sitemap
在 Astro 里搞 Sitemap 简单到离谱,因为官方直接给了一个集成 @astrojs/sitemap。
1. 安装
npx astro add sitemap
这命令会自动帮你装好依赖、注册到 astro.config.mjs。如果没有用 astro add,手动装也行:
pnpm add @astrojs/sitemap
2. 配置
我在 astro.config.mjs 里的配置非常简单,只加了两个关键项:
import sitemap from "@astrojs/sitemap";
export default defineConfig({
site: 'https://www.hexvork.com', // **这个是刚需,必须填你的域名**
trailingSlash: 'never', // URL 末尾不加斜杠
integrations: [
sitemap() // 零配置就能用
],
});
一定要填site的地址!!!
就这三行,astro build 后你的 dist 目录下就会自动生成 sitemap-index.xml。
3. 进阶调参
零配置足够用,但如果你想更精细地控制,可以传几个参数:
sitemap({
filter: (page) => page !== 'https://你不想让sitemap抓取的页面', // 排除不想被抓取的页面
changefreq: 'weekly', // 更新频率:always/hourly/daily/weekly/monthly/yearly/never
priority: 0.7, // 优先级:0.0~1.0,默认 1.0
lastmod: new Date(), // 最后修改时间
})
只需修改 filter 就行了。
实际建议:除非你有特殊需求,零配置就行。@astrojs/sitemap 会自动根据你的路由生成完整的站点地图,比手动维护靠谱一万倍。
4. 声明 Sitemap
光生成还不够,你得让搜索引擎知道去哪里找。两件事要做:
a) robots.txt 里声明
在 public/robots.txt 里加上一行:
User-agent: *
Allow: /
Sitemap: https://www.hexvork.com/sitemap-index.xml
b) 页面 Head 里加 link 标签
在你的 BaseHead.astro 里加一行:
<link rel="sitemap" href="/sitemap-index.xml" />
c) 去 Google Search Console 提交
进 Google Search Console,在”站点地图”里输入 sitemap-index.xml,点提交。Bing 的 Webmaster Tools 同理。
国内的话,百度站长平台也不建议完全放弃,虽然现在百度对个人博客收录越来越佛系,但提交了总比不提交强。
二、LLMs.txt
LLMs.txt 的生成比 Sitemap 稍微麻烦一点,因为在 Astro 里目前没有像 @astrojs/sitemap 那样”一行代码搞定”的官方集成。但别担心,有两种方案,各有优劣。
方案一:自定义 Endpoint
本站就在采用这个方案,这是最灵活的办法,本质就是在 Astro 里写一个 API 端点,动态生成 /llms.txt。本站的实际代码如下:
首先再\src\ 创建文件 config.ts (已创建就忽略)
再在config.ts最末尾粘贴以下代码:
export const llms = {
name: '站点名称',
description: '站点描述',
url: 'https://站点链接'
}
注意:你需要改成你的博客名称、描述、链接。
再在 src/pages/llms.txt.ts 里粘贴以下代码:
// src/pages/llms.txt.ts
import type { APIRoute } from 'astro';
import { getCollection } from 'astro:content';
import { llms } from "../src/config";
export const GET: APIRoute = async () => {
const posts = await getCollection('posts');
let content = `#${llms.name}\n\n`;
content += `> ${llms.description}\n\n`;
content += '## 文章\n\n';
const sortedPosts = posts
.filter((p) => p.data.title && p.data.abbrlink)
.sort((a, b) => b.data.date.getTime() - a.data.date.getTime());
for (const post of sortedPosts) {
const url = `${llms.url}/posts/${post.data.abbrlink}`;
const desc = post.data.description || '';
content += `- [${post.data.title}](${url})${desc ? ': ' + desc : ''}\n`;
}
return new Response(content, {
headers: { 'Content-Type': 'text/plain; charset=utf-8' },
});
};
若你博客的文章地址也和我差不多/posts/abbrlink,只需把url改成你的实际地址即可
src/pages/llms.txt.ts 中的代码可能因人而异,建议丢给AI让它配置
优点:
- 完全自定义,想输出什么格式就输出什么格式
- 只展示你想让 AI 看到的内容
- 可以加上站点描述、分类、标签等元信息
缺点:
- 目前只实现了
llms.txt(文章索引),没有llms-full.txt(全文内容)。对于想让 AI 深度理解你每篇文章内容的场景,光有索引不够 - 需要手写代码,虽然是 25 行的事
访问地址:https://你的域名/llms.txt
方案二:astro-llms-md 插件
这个包本站在 package.json 里已经装了但还没启用,它比方案一强大得多:
pnpm add -D astro-llms-md
用npm的粘贴以下代码
npm add -D astro-llms-md
如果你不知道你这个项目应该用啥,问本地AI工具
然后在 astro.config.mjs 里注册:
import llmsMd from 'astro-llms-md';
export default defineConfig({
integrations: [
sitemap(),
llmsMd(), // 一行搞定
],
});
astro build 后会自动生成三个东西:
| 文件 | 内容 | 给谁看 |
|---|---|---|
llms.txt | 按目录分组的文章索引,带 Markdown 文件链接 | AI 搜索引擎索引 |
llms-full.txt | 所有页面全文内容合并成一个文件 | 大模型深度理解/训练 |
.md 文件 | 每篇文章单独生成干净的 Markdown 文件 | AI 逐篇抓取 |
方案二的杀手锏是 llms-full.txt。它会把你网站所有页面的主要内容(自动提取 <main> 标签里的 HTML、转成 Markdown)拼成一个大文件。这意味着 AI 可以一次性读完你的全部文章,理解你的知识体系全貌——这才是 GEO 的真正价值。
两种方案怎么选?
| 场景 | 推荐方案 |
|---|---|
| 文章少(<50篇),只想要基础索引 | 方案一,够用 |
| 文章多,希望 AI 深度理解每篇文章 | 方案二 |
| 想要最大化的 GEO 效果 | 方案一 + 方案二混搭 |
三、验证配置
搞完配置后别急着庆祝,先验证一下:
Sitemap 验证
# 本地构建
pnpm run build
# 检查 dist 目录
ls dist/sitemap-index.xml
如果是开发模式,@astrojs/sitemap 不会生成文件(它只在 build 时触发)。想看效果就得 build。
线上验证直接访问 https://你的域名/sitemap-index.xml,看看能不能正常打开。正常的 Sitemap 长这样:
<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
<loc>https://你的域名/sitemap-0.xml</loc>
</sitemap>
</sitemapindex>
LLMs.txt 验证
直接访问 https://你的域名/llms.txt,应该能看到 Markdown 格式的文章列表:
# Hexvork Blog
> 分享网络优化、开发实战和工具评测,用人话讲技术。
## 文章
- [Python第一讲——Python和VS Code开发环境搭建教程](https://www.hexvork.com/posts/11): 想学Python但不知道怎么搭环境...
- [Obsidian 完整配置指南](https://www.hexvork.com/posts/10): 详解Obsidian的GitHub自动同步配置...
如果你启用了 astro-llms-md,构建后还会多出来 llms-full.txt 和一堆 .md 文件。
四、GEO 进阶:让 AI 更爱吃你的内容
光有 LLMs.txt 还不够,AI 搜索引擎吃不吃得进去,取决于你的内容本身有没有”营养”。以下是本站实际在用的几个 GEO 优化策略:
1. 每篇文章加上 description
description 是 AI 理解文章主题的第一入口。本站每篇文章的 frontmatter 里都写了 description:
description: 想学Python但不知道怎么搭环境?这篇文章手把手教你安装Python、配置VS Code...
不要写废话。用一句话把文章的核心价值和目标读者讲清楚。
2. 内容结构化
AI 喜欢结构化内容。本站的做法:
- 用
##和###分层级(不是#,一个页面只应该有一个 H1,通常是标题) - 用编号列表 + 加粗关键词(如上面的”必须勾选”)
- 关键步骤用代码块标注
反面教材:大段大段的纯文字,没有小标题、没有分段——AI 看了也头疼,跟人看论文没区别。
3. 内部链接相互引用
AI 爬虫会跟着链接走。本站文章里经常引用其他文章:
这样做有两个好处:
- 传统 SEO:搜索引擎会把内部链接当权重传递
- GEO:AI 能顺着链接理解你的知识体系,把你视为某个领域的”权威来源”
4. robots.txt 不要误伤 LLMs.txt
有些人的 robots.txt 配得特别保守,把所有 *.txt 都禁掉了。LLMs.txt 也是 txt 文件,别把自己给禁了。
本站的 robots.txt 就很干净
你需要把 llrobots.txt 修改成下面的,记得改你的实际地址:
User-agent: *
Allow: /
Sitemap: https://站点链接/sitemap-index.xml
直接全放行,让所有爬虫都能愉快地抓取。
五、踩坑记录
1. trailingSlash 问题
Astro 默认 trailingSlash: 'ignore',可能导致 Sitemap 里同一个页面出现 /posts/11 和 /posts/11/ 两个版本。
解决办法:在 astro.config.mjs 里明确设置 trailingSlash: 'never' 或 'always',然后在 Google Search Console 里设置首选域名格式。本站设为 'never',所有 URL 都不带尾斜杠。
2. 中文 URL 不要用
虽然技术上可行,但中文字符编码后的 URL 又丑又容易出问题。本站用 abbrlink(数字 ID)来生成文章 URL:
https://www.hexvork.com/posts/11
而不是:
https://www.hexvork.com/posts/Python第一讲...
纯数字短 URL,简洁、好记、不存在编码问题。
3. build 后记得检查
写完文章、astro build 后,养成去 dist 目录检查这几个文件的习惯:
dist/sitemap-index.xml # Sitemap 生成了吗?
dist/llms.txt # 如果你用方案一
dist/llms-full.txt # 如果你用方案二
别以为配置没问题就一定生成对了。我就遇到过某个文章 frontmatter 缺了字段,导致 LLMs.txt 端点直接报错的情况。上线前多看一眼,少走好多弯路。
结语
这一套搞下来,传统搜索引擎收录会有明显提升,AI 搜索引擎也能更好地理解你的网站内容。
这篇文章实践下来如果有困难,也可以直接丢给AI来做:
根据 https://www.hexvork.com/posts/14 这篇文章,生成Sitemap和LLMs.txt
折腾一次,后面发文章就全自动了。希望对你有帮助。