sitemap.xml 返回 200,里面列了 800 个 URL,Search Console → Sitemaps 显示 “Success”——但 Pages 报告里只看到 50 个 URL,剩下 750 不见踪影。
Sitemap “Success” 只代表 Google 能读懂这个 XML 文件,不代表它接受了里面所有 URL。下面是常见原因和验证方法。
症状
sitemap.xml返回 200 且列出了 URL- Search Console sitemap 状态 “Success”
- Pages 报告显示 0 个 discovered URL,或只显示一小部分
- “已发现 URL”数远低于 sitemap 实际 URL 数
快速结论
要么 sitemap 有 Google 默认容忍的格式问题,要么 URL 与 Google 自己挑的 canonical 不一致,要么 sitemap 上传到了另一个 property。
常见原因
1. Sitemap 用 http 但站点是 https(或反过来)
<url><loc>http://yourdomain.com/page/</loc></url>
但你站实际是 https。Google 严格按字面匹配,会忽略不匹配的 URL。
如何判断:
curl -s https://yourdomain.com/sitemap.xml | grep "<loc>" | head -5
# 所有 URL 必须是 https://
2. Sitemap URL 有尾斜杠 / 没尾斜杠不一致
<url><loc>https://yourdomain.com/article</loc></url>
但你的 canonical 是 https://yourdomain.com/article/(带斜杠)。Google 把这两个视为不同 URL,sitemap 里那个被忽略。
如何判断:抽 5 个 sitemap URL,对比页面 head 里的 canonical:
for url in $(curl -s https://yourdomain.com/sitemap.xml | grep -oE 'https://[^<]+' | head -5); do
canonical=$(curl -sL "$url" | grep -oE '<link rel="canonical" href="[^"]+"')
echo "sitemap: $url"
echo "canonical: $canonical"
echo "---"
done
应该完全一致(含 trailing slash)。
3. Sitemap 所在子域或路径与 GSC property 不同
你的 Search Console 验证的是 https://yourdomain.com/,但 sitemap 在 https://www.yourdomain.com/sitemap.xml——是两个不同的 property。
如何判断:Search Console → 设置 → 验证状态。看 property 类型是 Domain 还是 URL prefix,以及具体覆盖范围。
4. Sitemap 里 URL 返回 404 或重定向
Sitemap 里写了 URL,但抓取后是 404 / 301 → Google 不接受。
如何判断:
for url in $(curl -s https://yourdomain.com/sitemap.xml | grep -oE 'https://[^<]+' | head -20); do
status=$(curl -sI -o /dev/null -w "%{http_code}" "$url")
echo "$status $url"
done
期望全部 200。301 / 404 都要修。
5. XML 不规范,Google 默默截断
Sitemap 必须严格符合 protocol:
<?xml version="1.0" encoding="UTF-8"?>必须在第一行(前面不能有 BOM 或空格)<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">必须有这个 namespace- 单个 sitemap 最多 50,000 URL 或 50MB(未压缩)
如何判断:用 XML Sitemaps Validator 校验。
6. Sitemap 文件太大
如果你 sitemap 是 100MB 或 100,000 URL,Google 解析时会截断,只读前一部分。
修法:拆成 sitemap-index + 多个子 sitemap。
7. sitemap-index 引用错路径
<sitemapindex>
<sitemap><loc>./sitemap-1.xml</loc></sitemap> <!-- 相对路径,Google 拒收 -->
</sitemapindex>
必须绝对 URL。
最短修复路径
Step 1:浏览器直接打开 sitemap.xml + validator 校验
浏览器打开:https://yourdomain.com/sitemap.xml
应该看到结构化 XML,无错误提示
XML 校验:https://www.xml-sitemaps.com/validate-xml-sitemap.html
如果 XML 格式错,修了再往下。
Step 2:抽样 5 个 URL 验证 canonical 一致性
用 Step 1 的 canonical 对比脚本。任何不一致的修复:
- 协议(http vs https)
- 尾斜杠
- 大小写
www.vs 裸域
修法 = 统一源头:让 sitemap 生成函数和 canonical 渲染函数共用同一个 urlFor()。
Step 3:确认 sitemap 提交到正确的 GSC property
Search Console → 设置 → 验证类型:
- Domain property (
yourdomain.com):覆盖所有子域、协议、路径 - URL prefix property (
https://yourdomain.com/):只覆盖该 prefix
如果 sitemap 在 www.yourdomain.com 但 property 是 https://yourdomain.com/(无 www),换 Domain property,或在 www 重新建一个 URL prefix property。
Step 4:所有 URL 都可达 200
用 Step 4 的 curl 脚本批量检查。任何 301 / 404:
- 301:直接在 sitemap 里写最终 URL
- 404:从 sitemap 删除
Step 5:拆大 sitemap
<!-- sitemap-index.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap><loc>https://yourdomain.com/sitemap-articles.xml</loc></sitemap>
<sitemap><loc>https://yourdomain.com/sitemap-pages.xml</loc></sitemap>
</sitemapindex>
每个子 sitemap < 50,000 URL / 50MB。
Step 6:修复后重交
Search Console → Sitemaps → 删除旧 sitemap → 重新输入 URL 提交。等 7-14 天看 “已发现 URL” 数字。
哪些情况可能不是你操作错了
GSC sitemap 统计有时要 7-14 天才准确。刚提交不要急着排查。
容易误判的情况
- Sitemap 状态 “Success” = 全部 URL 入队:不是,只代表能解析
- 以为 sitemap “已发现 URL” 数字 = Indexed 数字:完全不同。前者是 sitemap 内 URL 数,后者是真正进索引的
- 以为 sitemap 提交后立刻有效:通常需要 24-72 小时
预防建议
- Sitemap 与 canonical 用同一数据源生成(共享
urlFor()helper) - CI 里校验 sitemap XML:格式、URL 数量、每个 URL 200
- URL 形式(协议 / www / 尾斜杠)与 canonical 完全一致
- 单 sitemap > 5000 URL 就拆成 sitemap-index
- 部署后 curl sitemap.xml 一次确认 200 + URL 数对
FAQ
Q:单 sitemap 能放多少 URL? A:5 万条或未压缩 50 MB;更多用 sitemap index。
Q:要为每种语言单独提交 sitemap 吗? A:都可以;分语言更容易调试和单独监控。
Q:lastmod 必须填吗? A:不必填但强烈推荐。填了 Google 知道哪些 URL 最近改过,优先重抓。