站点地图 sitemap.xml 配置

1. 什么是 sitemap?

Sitemap(站点地图) 是一个列出网站所有重要页面的文件(通常是 sitemap.xml),用于告诉搜索引擎有哪些页面可以被抓取和索引。如果没有 sitemap,很多页面不会被及时收录。

2. 为什么 sitemap 对 SEO 很重要

sitemap帮助搜索引擎正确高效理解网站

  1. 新课程、新课时上线后,Google 可以通过 sitemap 直接发现新页面,提高收录速度

  2. 覆盖深层页面, 有些页面如果没有外链或入口较少,例如:

    • /courses/[courseSlug]
    • /courses/[courseSlug]/lessons/[lessonSlug]
  3. 提供结构化信息,比如 lastModified,changeFrequency,priority,帮助搜索引擎更智能地抓取

3. Next.js 中实现 sitemap

以 RaytonX Learn 为例,在 App Router 中,可以直接使用:

// app/sitemap.ts
import { MetadataRoute } from "next";

export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
  const baseUrl = "https://raytonx.com";

  const courses = await getAllCourses();
  const lessons = await getAllLessons();

  return [
    // 首页
    {
      url: `${baseUrl}/courses`,
      lastModified: new Date(),
    },

    // 课程页
    ...courses.map((course) => ({
      url: `${baseUrl}/courses/${course.slug}`,
      lastModified: new Date(course.updated_at),
    })),

    // 课时页
    ...lessons.map((lesson) => ({
      url: `${baseUrl}/courses/${lesson.courseSlug}/lessons/${lesson.slug}`,
      lastModified: new Date(lesson.updated_at),
    })),
  ];
}

4. sitemap 更新策略

新课时发布后,sitemap 如何更新?

  1. 动态生成, 每次访问 /sitemap.xml, 实时查询数据库,返回最新内容
  2. 构建时生成 sitemap, 内容更新需要重新部署

RaytonX Learn 使用 动态 sitemap + 数据库查询, 及时更新。

5. 子网站 sitemap.xml 如何同步到主域名下

因为 RaytonX Learn 部署在域名子路径下,正常情况sitemap的地址在 https://raytonx.com/courses/sitemap.xml

主域名下配置 sitemap.xml 和 robots.txt, 然后通过 sitemap index 使搜索引擎发现子网站的 sitemap

  1. robots.txt

    import type { MetadataRoute } from "next";
    
    export default function robots(): MetadataRoute.Robots {
      return {
        rules: {
          userAgent: "*",
          allow: "/",
        },
        sitemap: "https://raytonx.com/sitemap.xml",
      };
    }
    
  2. sitemap.xml

    // app/sitemap.xml/route.ts
    import { NextResponse } from "next/server";
    
    export async function GET() {
      const xml = `<?xml version="1.0" encoding="UTF-8"?>
        <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
          <sitemap>
            <loc>https://raytonx.com/sitemap-main.xml</loc>
          </sitemap>
          <sitemap>
            <loc>https://raytonx.com/courses/sitemap.xml</loc>
          </sitemap>
        </sitemapindex>`;
    
      return new NextResponse(xml, {
        headers: {
          "Content-Type": "application/xml",
        },
      });
    }
    

这样搜索引擎就能通过 /sitemap.xml 来获得子站的 /courses/sitemap.xml