站点地图的 lastmod 写页面修改日还是生成日
站点地图里的 lastmod 应该写页面自己最后被修改的那一天,而不是这份站点地图文件被生成的时刻。协议文档对这个字段的定性是页面最后修改时间,格式按 W3C Datetime 给出,可以只写日期不写具体时间。写成生成日是最常见的误用,因为很多实现把文件输出时间当成本身的时间戳,全站重新生成时就把所有条目的日期一起刷成当天。
字段语义在协议里怎么写
lastmod 的作用是给抓取方一个判断依据:这条链接自上次访问之后有没有变过。它描述的对象是 URL 指向的页面,不是承载它的 XML 文件。两者时间可以相同,但含义不同,只要一次批量重建就会暴露差异。
同一段协议里对另外两个字段的态度也值得一起看:更新频率与优先级都被写成提示而不是命令。真正反映内容是否变化过的,仍然是修改时间这一项。因此把 lastmod 写准,比把频率字段调来调去更有意义。
全站重新生成会把日期刷掉
站点地图按定时任务整体重建是很常见的做法。如果生成逻辑取的是构建时间,会出现三个后果。第一,所有页面的修改时间同时变新,抓取方看到的是一次全站变动,实际内容一行没改。第二,真正变过的页面失去了区分度,重新抓取的成本被摊到全部 URL 上。第三,日期长期等于今天,字段本身不再携带信息,等同于没有写。
反过来,如果生成逻辑读的是文章记录里的更新时间,重建多少次都不会失真。核对方法很简单:连续两次生成站点地图,比较没有编辑过的页面条目日期是否保持不变。保持不变才说明读的是内容时间。
哪几类页面值得写
更新频繁或改动会改变答案的页面最值得写:内容正文、产品与价格说明、活动与公告类单页。相反,一次性发布且不再变更的归档页,写与不写影响都很小。首页和列表页要看实现,如果它们的内容由最新文章驱动,日期跟着更新是合理的;如果是固定版式,就不该每天变新。
站内由系统统一生成站点地图时,这件事的边界更清楚:字段由程序按内容记录填写,人工不参与,也就不该出现刷成当天的情况。需要关注的是更新时间是否真的只在内容变动时改变,改名、换分类、调整导航这类操作不应该把正文日期推后。
定时发布会改变页面的可见时间,这时 lastmod 也应跟着真实生效的那一刻走。设定在凌晨发出的文章,如果日期仍停留在草稿保存那天,抓取方看到的新旧顺序就和实际相反。
格式与时区上的两个坑
第一个坑是时间格式。带不带上午下午的时间部分都可以,但必须写成协议接受的日期时间形式,只精确到天就写天,不要混用本地习惯写法。第二个坑是时区。同一个时刻用本地时间和用协调世界时表达会差一天,站点地图里写的时间与页面自身头部给出的修改时间应当一致,两处不一致时抓取方通常更相信响应头部,字段就白写。
出现局部修订时,日期应当只推后被真正改动的那几条链接;如果批量替换了模板而正文未动,是否更新日期取决于呈现是否改变,稳妥做法是不改,把变动留给真正需要重新抓取的条目。
常见问题
没改正文只改了摘要,要不要更新 lastmod? 要。摘要变化会影响页面给出的答案,属于可见改动。
站点地图可以省略这个字段吗? 可以。缺字段只是少了一个参考信号,比写错日期造成的干扰更小。
日期写错了会被判罚吗? 不存在因此受罚的说法,问题在于信号失真:抓取分配可能把预算花在没有变动的页面上。
多久核对一次比较合适? 每次调整生成逻辑后核对一次,日常按月抽查几条未编辑过的旧文章即可。