Hexvork
Astro自动生成Sitemap和LLMs.txt完整教程

Astro自动生成Sitemap和LLMs.txt完整教程

很多人搭完博客就开始狂写文章,结果发现搜索引擎迟迟不收,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

折腾一次,后面发文章就全自动了。希望对你有帮助。