后台显示 Sitemap 已提交,但访问 /sitemap.xml 返回 404;或者 Last Generated 一直为空。先区分“文件没有生成”和“文件存在但 Web Server 不提供”两种情况。

后台路径与实际 URL 要一一对应

Marketing → SEO & Search → Site Map 中检查 Filename、Path 和 Store View。常见配置是 Filename=sitemap.xml、Path=/。多 Store 使用不同域名或目录时,每条 Sitemap 应绑定正确 Store。

手工生成一条并立即查看错误

bin/magento sitemap:generate -vvv
find pub -maxdepth 3 -name 'sitemap*.xml' -ls
tail -n 100 var/log/system.log var/log/exception.log

命令名称以当前版本 bin/magento list sitemap 为准。权限错误、目标目录不存在、Base URL 无效或商品集合异常都会在前台 Cron 之外更直接地暴露。

检查运行用户写权限

namei -l pub
sudo -u www-data test -w pub && echo writable
stat pub/sitemap.xml

生成用户可能是文件系统 owner,而 Web Server 是另一个用户。通过共享 group 和合理 umask 管理权限,不要对整个 pub 目录使用 777。

文件存在仍然 404

curl -skI https://www.example.com/sitemap.xml
curl -sk --resolve www.example.com:443:ORIGIN_IP   -I https://www.example.com/sitemap.xml
nginx -T | grep -n 'sitemap|location.*xml|try_files'

源站 200、CDN 404,清理精确对象并缩短错误缓存 TTL;源站也 404,检查 document root 是否指向 pub、蓝绿发布中的 sitemap 是否放在共享目录,以及 location 规则是否阻止 XML。

自动生成依赖 Cron

bin/magento cron:run
SELECT job_code, status, scheduled_at, executed_at, finished_at, messages
FROM cron_schedule
WHERE job_code LIKE '%sitemap%'
ORDER BY schedule_id DESC
LIMIT 20;

手工生成成功、自动生成失败,重点查 Cron 运行用户、计划时间和失败日志。不要用系统 Cron 额外再写一个直接覆盖文件的脚本,否则后台时间与真实文件会不一致。

SEO 验证

打开 XML 检查域名、协议、Store code、商品和分类 URL 是否属于当前 Store;抽样请求返回 200,不能把后台 URL 或另一个网站写进 Sitemap。最后在 robots.txt 中声明的 Sitemap 地址也必须与最终公开 URL 一致。

大型目录需要检查拆分文件

商品数量较多时 Sitemap 会拆成多个文件或达到搜索引擎对单文件 URL 数量、体积的限制。统计 XML 中 <url> 数量和文件大小,确保 Sitemap index 引用的每个子文件都可公开访问,并且没有混入后台、搜索结果和带 Session 参数的 URL。

grep -c '<url>' pub/sitemap.xml
du -h pub/sitemap*.xml
xmllint --noout pub/sitemap.xml

生成期间避免半文件被抓取

自定义生成器应先写临时文件、完成 XML 校验后再原子重命名。直接覆盖公开 sitemap.xml 时,搜索引擎可能抓到半截 XML。发布与共享存储也要保证 rename 发生在同一文件系统。