mcpField
X
xml-sitemap

xml-sitemap

github.com/kostja94营销与增长1.1k1.2k 次安装2 天前更新
代码仓库

关于 xml-sitemap

xml-sitemap 是面向技术 SEO 的技能,用于创建、审查和优化 XML 站点地图。它指导开发者筛选 URL、按协议生成文件、在 robots.txt 中声明并检查提交状态。

主要功能

  1. 01评估站点地图需求与 URL 数据
  2. 02生成符合协议的 XML 站点地图
  3. 03拆分大型或多语言站点地图
  4. 04筛选可索引页面并排除其他页面
  5. 05在 robots.txt 中声明站点地图
  6. 06指导在 GSC 中提交和验证

适用场景

  1. 01根据网站页面列表创建站点地图
  2. 02处理超过站点地图限制的网站
  3. 03整理多语言网站的 URL
  4. 04诊断站点地图获取或 XML 错误

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/kostja94/marketing-skills --skill xml-sitemap

安装后在 Claude Code 中输入/xml-sitemap确认已加载。

详细介绍

SEO 技术:Sitemap

介绍如何创建、审核和优化 Sitemap,帮助搜索引擎发现内容。

调用时:首次使用时,如果有帮助,可以先用 1–2 句话介绍此技能涵盖的内容及其重要性,然后提供主要输出。后续使用时,或用户要求跳过时,直接提供主要输出。

范围(技术 SEO)

  • Sitemap:创建 XML Sitemap;提交至 Google Search Console
  • URL 发现:帮助搜索引擎找到页面;对于大型网站或内部链接较弱的网站尤其重要

任务

根据项目的页面列表,生成符合 sitemaps.org 协议的 XML Sitemap,并在 robots.txt 中声明。

初步评估

**项目背景:**如果存在根目录下的 contextus.md,请阅读并仅加载与此任务相关的模块。若没有 Contextus,请使用现有项目资料或用户提供的信息,并询问缺失信息;不要创建并行的上下文系统。

确定:

  1. 网站 URL:基础域名(例如:https://example.com)
  2. URL 数量:可编入索引的页面总数(单个 Sitemap 还是 Sitemap 索引)
  3. 数据来源:静态配置、CMS、文件系统或混合来源
前提:网站是否需要 Sitemap?

生成前,先评估是否有必要创建 Sitemap。以下情况创建 Sitemap 的价值最高:

  • 大型网站(数百个以上页面),或反向链接很少的新网站
  • 层级较深或孤立的页面,内部链接难以触达
  • 富媒体内容(图片、视频、新闻)需要扩展元数据
  • GSC 中“已发现 — 尚未编入索引”或“未发现”的数量不断增加

内部链接完善且页面少于 50 个的小型网站可能并非一定需要 Sitemap,但创建 Sitemap 的成本几乎为零,也能为未来做好准备。如有疑问,建议创建。

1. 协议要点

项目规范
单个 Sitemap 的限制50,000 个 URL,50MB(未压缩)
Sitemap 索引超出限制时,拆分 Sitemap,并通过主索引引用子 Sitemap
编码UTF-8
URL 格式完整 URL,主机名相同,包含 https://
必需标签<loc>
可选标签<lastmod>、<changefreq>、<priority>

2. 字段要求

字段描述建议
url完整 URLhttps://example.com/path
lastModified页面最后修改时间使用页面元数据,采用 ISO 8601 格式;有数据时使用 YYYY-MM-DD,无数据时省略
changeFrequency更新频率首页 daily,列表页 weekly,内容页 monthly
priority相对重要性首页 1.0,聚合页 0.9,内容页 0.7–0.8,其他页面 0.5–0.6
lastmod(关键)
  • 必须准确:反映页面的实际修改时间,而不是 Sitemap 的生成时间。Google 要求该时间可验证;Bing 报告称约 18% 的 Sitemap 中 lastmod 值不正确。
  • 格式:W3C Datetime(YYYY-MM-DD 或 YYYY-MM-DDTHH:MM:SS+TZD),例如 2025-01-15、2025-01-15T14:30:00+08:00。
  • 避免:使用 new Date() 设置 lastmod——这会导致所有 URL 使用相同的时间戳,搜索引擎可能会忽略这些值。
  • 适用情况:内容更新、结构化数据变更或重要链接变更时。
changefreq / priority
  • changefreq:仅作提示,不会直接决定抓取频率。可用值:always、hourly、daily、weekly、monthly、yearly、never。
  • priority:0.0–1.0;不会影响排名;重要页面应设置较高的值,避免所有页面使用相同的值。

3. 架构与拆分

单个 Sitemap
  • URL 数量超过 50,000 时,直接生成 /sitemap.xml。
Sitemap 索引(多个子 Sitemap)
  • 超出限制时,按类型或语言拆分;主索引引用子 Sitemap。
  • 拆分示例:/sitemap/posts.xml、/sitemap/pages.xml、/sitemap/zh.xml、/sitemap/en.xml。
  • 主索引输出为 /sitemap.xml 或 /sitemap-index.xml,每个条目格式为 <sitemap><loc>...</loc></sitemap>。
多语言站点
  • 按语言区域拆分:/sitemap/zh.xml、/sitemap/en.xml。
  • 或按内容类型 + 语言拆分:/sitemap/zh-posts.xml、/sitemap/en-posts.xml。
多语言站点地图(站点地图中的 hreflang)

对于多语言站点,在每个 <url> 条目中添加 xhtml:link hreflang 替代项。推荐大型站点使用(100+ 个多语言页面);可集中管理 hreflang。

规则:

  • 每种语言版本都必须链接到所有其他版本,包括自身(自引用)。
  • 添加指向默认语言区域的 x-default。
  • 使用 xmlns:xhtml="http://www.w3.org/1999/xhtml" 命名空间。
  • <loc> 通常使用默认语言区域的(简洁)URL;x-default 也指向该 URL。
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
        xmlns:xhtml="http://www.w3.org/1999/xhtml">
  <url>
    <loc>https://example.com/page</loc>
    <xhtml:link rel="alternate" hreflang="en" href="https://example.com/page" />
    <xhtml:link rel="alternate" hreflang="zh" href="https://example.com/zh/page" />
    <xhtml:link rel="alternate" hreflang="x-default" href="https://example.com/page" />
  </url>
</urlset>

在站点地图索引中列出所有语言的站点地图;并将其添加到 robots.txt。

4. 实现

技术栈实现方式
Next.js App Routerapp/sitemap.ts 导出 MetadataRoute.Sitemap 或使用 generateSitemaps
Next.js Pages Routerpages/sitemap.xml.ts 或使用 getServerSideProps 返回 XML
Astrosrc/pages/sitemap-index.xml.ts 或使用 @astrojs/sitemap
Vite / 静态构建构建脚本生成 public/sitemap.xml
其他生成静态 /sitemap.xml,或通过 API 动态返回
排除路由
  • 如果项目使用 i18n / 中间件重定向,请排除站点地图路径,以避免重定向。
  • 示例(Next.js matcher):'/((?!api|_next|sitemap|sitemap-index|.*\\..*).*)'。

5. 页面范围

包含
  • 首页:/
  • 语言区域/地区首页(例如 /zh、/en)
  • 所有可编入索引的内容页面、列表页面、分类页面
排除
  • /api/*、/admin/*、/_next/*
  • 静态资源(图片、JS、CSS 等)。如需发现图片,请使用图片站点地图扩展——参见 image-optimization。如需发现视频,请使用视频站点地图扩展——参见 video-optimization
  • 登录、管理、草稿以及其他不打算编入索引的页面

6. 数据源与维护(单一事实来源)

  • 单一事实来源:从配置、CMS 或元数据中读取 URL 列表;避免在站点地图中硬编码。
  • 多种页面类型:可将工具、博客、营销页面合并到一个数组中,以统一生成。
  • 新增页面:只需添加到数据源;站点地图会自动更新;避免在多个地方维护。
中央配置(推荐)

创建一个配置文件(例如 site-pages-config.ts),导出:

  • 按版块(工具、博客、营销等)划分的页面 slug/路径
  • 可选:每个页面的 modifiedDate,以准确设置 lastmod
  • 函数:getAllPageUrls(baseUrl),供站点地图和 IndexNow 使用

原因:站点地图、IndexNow 和 feed 都可以从同一配置导入,避免重复维护 URL。IndexNow 应使用相同的 URL 列表;避免单独硬编码列表。

7. robots.txt

添加到 robots.txt:

Sitemap: https://example.com/sitemap.xml

有多个站点地图时,只声明主索引。

8. 输出格式

单个站点地图示例
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://example.com/</loc>
    <lastmod>2025-01-15</lastmod>
    <changefreq>daily</changefreq>
    <priority>1.0</priority>
  </url>
  <url>
    <loc>https://example.com/page</loc>
    <lastmod>2025-01-10</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.8</priority>
  </url>
</urlset>
站点地图索引示例
<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <sitemap>
    <loc>https://example.com/sitemap/pages.xml</loc>
    <lastmod>2025-01-15</lastmod>
  </sitemap>
  <sitemap>
    <loc>https://example.com/sitemap/posts.xml</loc>
    <lastmod>2025-01-14</lastmod>
  </sitemap>
</sitemapindex>

9. 提交与验证

生成站点地图后,引导用户完成提交:

  1. robots.txt:添加 Sitemap: https://example.com/sitemap.xml(或索引 URL)
  2. Google Search Console:前往索引 → 站点地图,输入站点地图 URL 并提交
  3. 验证:在 GSC 站点地图报告中,检查“已发现的网页”数量是否符合预期;如果差距较大,请调查原因
  4. 监控:24–48h 后,确认状态显示“成功”;在索引 → 网页报告中按站点地图筛选,查看“已编入索引”与“未编入索引”的数量明细

需要指出的常见提交错误:

  • 站点地图 URL 返回 404 — 检查构建输出和部署
  • “无法获取” — 确认 robots.txt 未屏蔽站点地图 URL
  • “HTML 页面”错误 — 参见下方 §10 HTML 诊断

10. HTML 诊断(站点地图返回 HTML 而非 XML)

当 /sitemap.xml 返回 HTTP 200,但 Content-Type: text/html 且内容为首页时,Google 会静默拒绝该站点地图——由于状态码为 200,GSC 不会发出提醒。这比 404 更糟。

常见原因:

  • 全匹配页面路由(pages/[...slug].vue、Next.js 全匹配路由)在站点地图处理程序之前拦截请求
  • i18n 模块的运行优先级低于 routeRules/中间件
  • 地理位置重定向或重定向插件匹配了站点地图路径
  • CDN/缓存层移除了 Content-Type 标头

使用以下方式诊断:

curl -I https://example.com/sitemap.xml          # Check Content-Type
curl -A "Googlebot" -I https://example.com/sitemap.xml  # Googlebot's view
curl -s https://example.com/sitemap.xml | head -5       # First lines must be XML

修复(Next.js):使用 server/routes/sitemap.xml.ts(优先级最高,可绕过全匹配路由)。对于 i18n,请添加 excludePatterns: [/^\/sitemap.*\.xml$/]。重命名站点地图文件(例如,改为 sitemap_index.xml)可以绕过 Google 对失败状态的缓存。

11. 常见问题

问题原因 / 修复
站点地图 404构建失败、路径错误、导出不正确;检查路由和部署
页面缺失数据源中没有这些 URL,或已被筛选、排除
lastmod 异常避免使用 new Date();使用页面元数据中的 modifiedDate
Google 未编入索引在 GSC 中提交站点地图;检查 Coverage(google-search-console)和 robots
EN/ZH URL 不匹配使用统一的数据源;按语言生成时共用同一列表
站点地图返回 HTML全匹配路由或 i18n 在站点地图处理程序之前拦截请求;使用 curl -I + Googlebot UA 进行诊断;参见 §10

参考资料

相关技能

  • website-structure:规划页面结构和 URL 列表;站点地图反映已规划且可编入索引的页面
  • google-search-console:站点地图状态、已编入索引的 URL 数量、Coverage
  • robots-txt:在 robots.txt 中引用站点地图
  • indexnow:从配置中共用同一 URL 列表
  • image-optimization:用于发现图片的图片站点地图扩展
  • video-optimization:用于发现视频的视频站点地图扩展

评论

支持 Markdown