生成 sitemap 时,lastmod 这一栏很容易被随手填成当天日期——反正自动生成脚本里取当前时间最省事。但这个字段的作用是告诉搜索引擎「这个页面什么时候真的变过」,如果每次都填今天,它传递的信息就是「所有页面每天都在变」。搜索引擎很快会识别出这个字段不可信,然后开始忽略它。
lastmod 的作用
lastmod 表示页面的最后修改时间,格式是 YYYY-MM-DD。
搜索引擎用它来判断「这个页面是否需要重新抓取」。如果 sitemap 里的 lastmod 显示某个页面最近没有变化,而搜索引擎上次抓取的内容和现在一致,它就没必要再来一次。这个机制能显著节省抓取资源,让爬虫把精力放在真正更新的内容上。
反过来说,如果 lastmod 不可信,这个优化机制就失效了——爬虫无法区分「真的更新了」和「只是时间戳变了」,只能按固定频率抓取,或者降低整个站点的抓取优先级。
为什么「填今天」是有害的
假设站点有 5000 个页面,每天生成的 sitemap 里所有页面的 lastmod 都是当天日期。搜索引擎第一次看到时可能还会尝试多抓一些,但很快就会发现问题:抓回来的内容大部分和上次一样,没有任何变化。
结果有两个层面。
第一,lastmod 字段被忽略。搜索引擎会判断这个站点的 lastmod 不可靠,转而使用自己的启发式规则(比如按页面权重、按更新历史频率)来决定抓取节奏。你失去了这个字段能带来的优化。
第二,抓取预算被浪费。如果搜索引擎真的按 lastmod 去抓,那每天都要抓 5000 个页面,而其中 95% 没有变化。这些抓取配额本可以用在新内容上,现在被浪费在重复抓取上。对于抓取预算有限的站点,这会直接影响新页面的收录速度。
正确的做法
原则很简单:如实填写。
实现上有几种常见方案。
第一,从数据库取真实的更新时间。如果站点有内容管理系统,每个页面通常都有一个 updatetime 字段,直接用它。这是最准确的做法。
第二,从文件系统取修改时间。对于静态站点,可以用文件的修改时间。这个时间在内容真正被改动时才会变化,能如实反映变化。
第三,构建时生成。在构建过程中记录每个页面的内容哈希,与上一次构建的结果比较,只有变化的页面才更新 lastmod。这种做法最精确,但实现成本也最高。
无论用哪种方式,关键是让 lastmod 只在内容真正变化时更新。如果一次部署只是改了样式或模板,而内容没变,那么 lastmod 理论上不应该变化——不过实践中很多实现做不到这个精度,只要不是每天全站更新,效果就可以接受。
与之相关的两个字段
同一份 sitemap 里还有另外两个字段,它们的现状值得一起说明。
changefreq 表示页面的更新频率,可选值包括 always、hourly、daily、weekly、monthly、yearly、never。这个字段主流搜索引擎已基本忽略,填错不会有惩罚,但格式必须合法。
priority 表示页面在本站内的相对重要程度,取值 0.0 到 1.0。它同样已基本被忽略,而且需要强调的是,它只表示站内相对权重,不是跨站权重——把 priority 填成 1.0 不会让页面在其他站点面前显得更重要。
既然这两个字段都被忽略,为什么还要填?主要原因是格式规范性和工具兼容性。有些站点分析工具会读取这些字段做统计,部分较小的搜索引擎也仍在使用。所以填对格式即可,不必在数值上纠结。
一个务实的配置
如果站点更新频率不高,比较省事的配置是:
只输出 loc 和 lastmod 两个字段,其中 lastmod 从数据库或文件系统取真实值。省略 changefreq 和 priority。
这样生成的 sitemap 更短、更聚焦,也避免了维护两个无效字段的成本。搜索引擎只需要 loc 就能发现页面,lastmod 则提供了有价值的更新信号。
如果出于兼容性考虑要保留后两个字段,就按实际情况填——首页 daily,文章页 monthly,关于页 yearly;priority 按目录层级递减,根目录高、深层页低。
检查清单
- lastmod 表示页面真实的最后修改时间,用于判断是否需要重新抓取
- 每次都填当天会让字段失去可信度,搜索引擎转而忽略它
- 不实的 lastmod 还会浪费抓取预算,拖慢新内容的收录
- 正确做法是从数据库或文件系统取真实时间,或在构建时按内容变化更新
- changefreq 与 priority 已被主流搜索引擎基本忽略,填对格式即可
- 务实配置是只输出 loc 与 lastmod,省略两个无效字段