你从 old.com 迁到 new.com。配了重定向。更新了 Search Console。但你查 https://new.com/sitemap.xml,里面 URL 还是 <loc>https://old.com/article</loc>。Search Console 报 “URLs in sitemap from wrong host”。哪怕重定向工作,Google 的 sitemap 解析器可能丢弃跟 sitemap 自身主机不匹配的 URL——你等于发了个废的 sitemap。多数静态站生成器构建时把 site URL 烤进 sitemap,所以原因几乎都是迁移时没更新 site 配置。
常见原因
按命中率从高到低。
1. Astro site: 配置仍指旧 URL
astro.config.mjs:
export default defineConfig({
site: 'https://old.com', // ← bug
});
@astrojs/sitemap 读 site 组 URL。陈旧配置 → 陈旧 sitemap。
怎么判断:打开 astro.config.mjs 看 site 值。是旧的就是这条。
2. Next.js siteUrl env var 还是旧的
next-sitemap.config.js:
module.exports = { siteUrl: process.env.SITE_URL || 'https://old.com' };
生产环境没设 SITE_URL 就 fall back 到硬编码旧 URL。
怎么判断:查 .env.production 或平台环境变量里的 SITE_URL。
3. Hugo config.toml 的 baseURL 没改
baseURL = "https://old.com"
Hugo 把这个烤进所有生成 URL 包括 sitemap。
4. 自定义 sitemap 脚本硬编码 URL
有些站用自定义构建脚本生成 sitemap,里面硬编码 host。迁移时忘改。
怎么判断:grep -rn "old.com" scripts/ build/。
5. CDN 缓存了旧 sitemap
你更新了配置重新部署,但 CDN 从缓存服务旧 sitemap.xml。
怎么判断:部署后 curl yourdomain.com/sitemap.xml?nocache=$(date +%s) 绕缓存。跟 curl yourdomain.com/sitemap.xml 不一样 = CDN 缓存。
6. Sitemap 分多个文件、只更新了主的
站点有 sitemap-index.xml 引用 sitemap-articles.xml、sitemap-pages.xml 等。你改了配置但只主 sitemap 重新生成。
怎么判断:打开每个子 sitemap 检查。
最短修复路径
第 1 步:找 site URL 配置
去这些地方找:
- Astro:
astro.config.mjs→site: - Next.js:
next-sitemap.config.js、next.config.js、env vars - Hugo:
config.toml或hugo.toml→baseURL - SvelteKit:
svelte.config.js→ adapter config 或 env - 自定义:
grep -rn "siteurl\|site_url\|baseurl" .
找到 canonical site URL 设置的地方。
第 2 步:改成新 URL
设为新 canonical URL:
// Astro
site: 'https://new.com',
# Hugo
baseURL = "https://new.com"
# Next.js / .env.production
SITE_URL=https://new.com
第 3 步:重构建重部署
npm run build
部署前本地验证:cat dist/sitemap-index.xml | head -20——URL 应用新域名。
第 4 步:生产验证
curl https://new.com/sitemap.xml | head -20
curl https://new.com/sitemap-articles.xml | head -20 # 如果分拆了
所有 URL 应引用新域名。看到旧的就强制清 CDN 缓存。
第 5 步:提交更新的 sitemap
Search Console → 新 property → Sitemaps → 提交 sitemap.xml。旧 sitemap 已注册就移除老条目。
第 6 步:CI 加断言
# 构建后 CI 跑
if grep -q "old.com" dist/sitemap*.xml; then
echo "ERROR: sitemap still references old domain"
exit 1
fi
防止回归。
哪些情况可能不是你操作错了
一些 sitemap 生成器独立于 site 配置(自定义脚本)——审你的整个构建管道,不只是一个配置文件。
容易误判的情况
以为平台”自动检测”部署 URL。多数不会——它们构建时从配置文件烤值。配置陈旧 = sitemap 陈旧。
预防建议
- Site URL 单一数据源(config 或 env)。
- CI 断言:sitemap URL 必须匹配 canonical 主机。
- 任何域名变更后本地构建并检查 sitemap 再部署。
- 生产用环境变量设 site URL,不要硬编码。
- 多 sitemap 设置:审每个子 sitemap,不只是
sitemap-index.xml。
FAQ
- Google 多久反映新 sitemap? 1-14 天处理。在 Search Console 显式提交加速。
- 能临时有两个 sitemap 吗? 能——每语言一个或每分区一个都行。但任何 sitemap 里的所有 URL 都必须用 canonical 主机。