コンテンツへスキップ
My Site

RSS 和网站地图

blog 模板预配置了 RSS feed 和网站地图。本页介绍其工作原理以及如何自定义。

网站地图

网站地图由 @astrojs/sitemap 生成,自动包含每个静态生成的页面。

设置

安装集成(blog 模板中已包含):

pnpm add @astrojs/sitemap

添加到 astro.config.mjs

import sitemap from "@astrojs/sitemap";

export default defineConfig({
  site: "https://your-site.com",   // 网站地图必需
  integrations: [
    notro(),
    sitemap(),
  ],
});

网站地图生成在 /sitemap-index.xml,并从 <head> 自动链接。

排除页面

要从网站地图中排除特定页面:

sitemap({
  filter: (page) => !page.includes("/draft/"),
}),

RSS feed

RSS feed 在 /rss.xml 提供,由 @astrojs/rss 生成。

设置

安装包(blog 模板中已包含):

pnpm add @astrojs/rss

创建 src/pages/rss.xml.ts

import rss from "@astrojs/rss";
import { getCollection } from "astro:content";
import { getSortedPosts, excludeFixedPages } from "@/lib/posts";
import { config } from "@/config";
import type { APIContext } from "astro";

export async function GET(context: APIContext) {
  const allPosts = await getCollection("posts");
  const posts = getSortedPosts(excludeFixedPages(allPosts));

  return rss({
    title: config.site.name,
    description: config.site.description,
    site: context.site!,
    items: posts.map((post) => ({
      title: post.data.title,
      description: post.data.description,
      pubDate: post.data.date ? new Date(post.data.date) : new Date(),
      link: `/blog/${post.data.slug}/`,
    })),
    customData: `<language>zh-CN</language>`,
  });
}

链接 feed

Layout.astro<head> 中添加 RSS feed 链接:

<link
  rel="alternate"
  type="application/rss+xml"
  title={config.site.name}
  href={new URL("rss.xml", Astro.site)}
/>

在 feed 中包含内容

要在 RSS feed 中包含每篇文章的完整 HTML 内容,使用 sanitizeHtmlmarked

pnpm add sanitize-html marked

import sanitizeHtml from "sanitize-html";

import { marked } from "marked";

items: posts.map((post) => ({

  title: post.data.title,

  pubDate: post.data.date ? new Date(post.data.date) : new Date(),

  link: `/blog/${post.data.slug}/`,

  content: sanitizeHtml(await marked.parse(post.data.markdown)),

})),

注意: RSS 内容从原始 markdown 渲染,而非带 Notion 组件的编译 MDX。自定义块类型(标注、折叠等)在 feed 阅读器中会显示为纯文本。


robots.txt

创建 public/robots.txt 控制爬虫访问:

User-agent: *
Allow: /

Sitemap: https://your-site.com/sitemap-index.xml

Open Graph 和 SEO

blog 模板的 Layout.astro 自动包含 Open Graph meta 标签:

<meta property="og:title" content={title} />
<meta property="og:description" content={description} />
<meta property="og:url" content={Astro.url} />
<meta property="og:type" content="article" />

astro.config.mjs 中设置 site 以确保 og:url 是绝对 URL。

每篇文章的 OG 图片

要添加每篇文章的 Open Graph 图片,使用 Astro 的 @vercel/ogsatori 生成:

pnpm add @vercel/og

创建 src/pages/og/[slug].png.ts 并将生成的 URL 作为 og:image 传入布局。有关动态图片生成的详情,请参阅 Astro 文档。