关于 xml-sitemap
xml-sitemap 是面向技术 SEO 的技能,用于创建、审查和优化 XML 站点地图。它指导开发者筛选 URL、按协议生成文件、在 robots.txt 中声明并检查提交状态。
主要功能
- 01评估站点地图需求与 URL 数据
- 02生成符合协议的 XML 站点地图
- 03拆分大型或多语言站点地图
- 04筛选可索引页面并排除其他页面
- 05在 robots.txt 中声明站点地图
- 06指导在 GSC 中提交和验证
适用场景
- 01根据网站页面列表创建站点地图
- 02处理超过站点地图限制的网站
- 03整理多语言网站的 URL
- 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,请使用现有项目资料或用户提供的信息,并询问缺失信息;不要创建并行的上下文系统。
确定:
- 网站 URL:基础域名(例如:
https://example.com) - URL 数量:可编入索引的页面总数(单个 Sitemap 还是 Sitemap 索引)
- 数据来源:静态配置、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 | 完整 URL | https://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 Router | app/sitemap.ts 导出 MetadataRoute.Sitemap 或使用 generateSitemaps |
| Next.js Pages Router | pages/sitemap.xml.ts 或使用 getServerSideProps 返回 XML |
| Astro | src/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. 提交与验证
生成站点地图后,引导用户完成提交:
- robots.txt:添加
Sitemap: https://example.com/sitemap.xml(或索引 URL) - Google Search Console:前往索引 → 站点地图,输入站点地图 URL 并提交
- 验证:在 GSC 站点地图报告中,检查“已发现的网页”数量是否符合预期;如果差距较大,请调查原因
- 监控: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:用于发现视频的视频站点地图扩展