搜索全站
Google SEO 10 分钟阅读

向 Google 提交 sitemap 的正确姿势:位置、拆分、更新与常见错误

sitemap 不是 URL 清单,而是给 Google 的抓取优先级信号。本文讲清 sitemap 的放置位置、索引文件拆分规则、lastmod 的真实含义、HTTP 提交方式,以及 GSC 里各种读取状态的排查。

U
UFO_PF 2018-05-15 · 阅读 10 分钟
向 GOOGLE SEO
阅读提示
本文约 3,935 字,预计阅读 10 分钟。文中命令与配置均经过实测,可直接参考执行。

引言:sitemap 提交了,为什么状态一直是「无法读取」

不少站点的 GSC 站点地图报告里常年挂着一条黄色提示:状态是「无法读取」或者「已读取,但发现了问题」,展开后是一堆「已排除的网址」或「sitemap 中的网址被 robots.txt 阻止」。站长通常是提交完就再没看过。

sitemap 的作用被普遍高估了——它不能让页面被收录,只能让页面被发现得更快。Google 官方也明确说过,sitemap 是辅助发现手段,不是收录保证。真正决定收录的仍然是内容质量与站点权威。但 sitemap 有一个不可替代的作用:它是你主动告诉 Google “这些页面对我重要”的通道,因此里面放什么、不放什么,本身就是一种优先级声明。

原理分析:sitemap 的三条硬规则

第一条是位置。 sitemap 只能声明它所覆盖路径层级上的 URL。放在 https://example.com/blog/sitemap.xml 的文件,不能声明 https://example.com/product/xxx。要覆盖全站就放在根目录。

第二条是格式与编码。 必须 UTF-8 编码、必须转义 &、'、<、> 五个 XML 实体字符,URL 必须完整绝对且与其在站点上的形式完全一致(含协议、大小写)。这是最常见的解析失败原因——很多插件生成的 URL 没做转义,遇到带 & 参数的链接就报错。

第三条是 lastmod 的语义。 lastmod 必须是页面实质性修改的时间,且格式要符合 W3C Datetime(如 2026-04-02T09:14:22+08:00)。把它写成每天自动更新的当前时间,等于告诉 Google “我每天都在改但内容其实没变”,长期会让这个字段失去参考价值,甚至降低抓取优先级。

项目 常见错误 正确做法
文件位置 放在子目录声明全站 URL 放根目录,或用索引文件
URL 转义 参数里的 & 未转义为 &amp; 生成时做 XML 实体转义
lastmod 每次构建都写当前时间 只写实质更新的时间
内容范围 放 noindex / 重定向 / 404 URL 只放可索引的规范 URL
大小上限 单文件几万条 单文件 ≤ 5 万 URL、≤ 50MB 未压缩
提交方式 只放 robots.txt GSC 提交 + robots.txt 声明

保姆级实操

步骤 1:确认站点地图的 URL 结构。 WordPress 从 5.5 起内置了 wp-sitemap.xml(位于 /wp-sitemap.xml,按类型拆分为 /wp-sitemap-posts-post-1.xml 等)。如果你装了 Yoast SEO、Rank Math、All in One SEO,它们各自的地图地址分别是 /sitemap_index.xml、/sitemap_index.xml、/sitemap.xml。不要同时启用多个插件的站点地图,会出现多份地图互相打架。

步骤 2:按类型拆分并用索引文件组织。 单文件超过 5 万条就要拆分,拆开后用 sitemap index 汇总。下面是一份可直接参考的结构:

<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemap.org/schemas/sitemap/0.9">
  <sitemap>
    <loc>https://www.example.com/wp-sitemap-posts-post-1.xml</loc>
    <lastmod>2026-04-02T09:14:22+08:00</lastmod>
  </sitemap>
  <sitemap>
    <loc>https://www.example.com/wp-sitemap-posts-page-1.xml</loc>
    <lastmod>2026-03-28T16:02:00+08:00</lastmod>
  </sitemap>
  <sitemap>
    <loc>https://www.example.com/wp-sitemap-taxonomies-category-1.xml</loc>
    <lastmod>2026-03-28T16:02:00+08:00</lastmod>
  </sitemap>
</sitemapindex>
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://www.example.com/blog/google-seo-guide/</loc>
    <lastmod>2026-04-02T09:14:22+08:00</lastmod>
  </url>
  <url>
    <!-- 参数里的 & 必须转义为 &amp;,否则解析失败 -->
    <loc>https://www.example.com/compare/?a=shopify&amp;b=woocommerce</loc>
    <lastmod>2026-03-19T11:30:00+08:00</lastmod>
  </url>
</urlset>

步骤 3:在 robots.txt 里声明,同时也去 GSC 提交。 两处都写:robots.txt 里的 Sitemap: 指令让所有支持的引擎都能找到,GSC 提交则能拿到「已读取」的状态反馈与错误明细。

步骤 4:提交后看状态与「发现的网址数」。 GSC → 站点地图,看状态(成功 / 已读取,但发现问题 / 无法读取)与“已发现的网址”数量。如果“已发现网址数”远小于文件里的 URL 数,通常是解析失败或被 robots 阻止。

步骤 5:修正被阻止的 URL。 报告里点开被排除的分组,常见是「被 robots.txt 阻止的网址」——如果你希望这些页面被索引,就去改 robots.txt;如果不希望,就把它们从 sitemap 里删掉。sitemap 里绝对不能放被 robots 屏蔽的 URL,这是自相矛盾的声明。

步骤 6:更新通知用 ping 而不是反复提交。 内容更新后,向 https://www.google.com/ping?sitemap=https://www.example.com/sitemap.xml 发一次 GET 请求即可触发重新读取。不需要每次都登录 GSC 手动提交。WordPress 在发布文章时会自动触发这个 ping。

步骤 7:排除不需要索引的类型。 用 Yoast 或 Rank Math 时,把标签页、作者归档、媒体附件页从地图里排除;用 WordPress 核心地图时,用 wp_sitemaps_taxonomies 等过滤器移除。

常见踩坑

  1. sitemap 里放全部 URL 以求“都被发现”。 见 已发现尚未编入索引的处理,这会稀释优先级。
  2. 启用多个 SEO 插件导致多份地图。 保留一份,其余插件的地图功能关掉,并把旧地址 301 到保留的那份。
  3. lastmod 每次构建都变。 这个字段会失效,抓取频率反而下降。
  4. XML 里的 & 没转义。 直接导致「无法读取」,且错误信息很隐晦。
  5. sitemap 文件被缓存插件或 CDN 返回了 HTML。 用 curl -I 确认 Content-Type: application/xml。
  6. 压缩格式用错。 只支持 .xml 或 .xml.gz,zip 不支持。
  7. 案例: 一个站点 sitemap 状态常年「无法读取」,检查后发现是商城插件在生成 URL 时把筛选参数原样写入,& 未转义。修复转义后地图立刻读取成功,但由于长年被阻止,Google 对该地图的信任度已经很低,重新积累优先级又花了一个多月。sitemap 的错误要第一时间修,拖延会损失信任积累。

总结

sitemap 的正确用法可以浓缩成六条:放根目录、按类型拆分、只放可索引的规范 URL、URL 做 XML 转义、lastmod 写真实的实质修改时间、robots.txt 与 GSC 两处都声明。判断做得对不对,看 GSC 里“发现的网址数”是否接近文件里的 URL 数、以及「已编入索引」占「已发现」的比例。这个比例如果长期低于 50%,问题不在 sitemap,而在内容质量和 URL 空间收敛上。

U
UFO_PF作者

专注 WordPress 生态的实战作者,内容以「可复制、可验证」为第一原则。

留下你的想法

邮箱地址不会被公开。带 * 的为必填项。