站点运营

站点运营:时间戳与时区自查,别让蜘蛛看到“未来”的更新时间

很多站点的时间信号是乱的:服务器、应用、数据库各用一套时区,日志和页面时间差了几小时,Last-Modified 被批量刷成同一天,Sitemap 的 lastmod 甚至写着未来时间。本文整理时间戳与时区的一致性检查方法,从响应头、日志到定时发布逐项核对,让蜘蛛拿到的时间信号前后对得上。

站点运营

站点运营:时间戳与时区自查,别让蜘蛛看到“未来”的更新时间

做站点运营的时候,很少有人会把“时间”当成一个需要检查的配置项。但蜘蛛判断一个页面要不要重新抓取,除了看内容变化,也很依赖服务器给出的时间信息:DateLast-Modified,以及 Sitemap 里的 lastmod。这些时间只要互相矛盾,蜘蛛拿到的就是一套混乱的信号。

先统一服务器的“表”

服务器时区没统一,是最常见也最容易被忽略的问题。同一台机器上,系统时区、应用运行时(PHP、Node、Java)时区、数据库时区可能各不相同,于是写进页面的时间和写进日志的时间能差好几个小时。

  • 系统层面固定一个时区(UTC 或固定的东八区),不要依赖服务器所在地的默认值;
  • 应用运行时单独设置时区,避免系统改了、代码还在用旧默认值;
  • 数据库连接时区与写入时区保持一致,防止存进去的是 UTC、读出来当成本地时间;
  • 多台服务器或容器节点之间开启 NTP 对时,否则各节点时间漂移,集群里同一次抓取的时间戳都对不上。

日志时间和页面时间对不上,结论就会错

日志里记录的是服务器时间,而你分析时看的是自己电脑的时间。如果两者差 8 小时,很容易得出错误结论:以为蜘蛛凌晨三点最活跃,实际那是晚上十一点;以为某个栏目一整天没被抓,其实只是统计窗口错位了。

做日志分析前,先把日志时间换算到统一基准,并在结论里标明用的是哪个时区。如果日志格式里没有时区标识,建议在格式中加入偏移量,省得以后每次都要靠猜。

Last-Modified 与 Sitemap 的 lastmod 要对得上

Last-Modified 只精确到秒,而且应该是真实的修改时间。常见的几种错误写法:

  • 模板改动或部署上线时批量刷新了全站页面的 Last-Modified,让蜘蛛误以为所有内容都更新了;
  • 时间戳被写成了未来时间,蜘蛛可能直接忽略这个值,甚至把页面当作异常;
  • 页面正文里显示的更新时间和 HTTP 头里的时间不一致,用户看到“今天更新”,头里却是半年前。

Sitemap 里的 lastmod 同理。用 W3C 格式(YYYY-MM-DD 或带时区偏移的完整时间)就够了,不建议为了显得新鲜而每天整站改成当天。如果所有 URL 共用同一个时间戳,基本等于告诉蜘蛛这份时间表没有参考价值。

定时发布与缓存过期

定时发布功能如果时区设置错了,会出现两种尴尬情况:内容提前可见,或者蜘蛛按时来抓却只拿到空页面和 404。发布前可以确认这几点:

  1. 发布任务的调度时区与站点展示时区一致;
  2. 草稿、预览地址不被蜘蛛访问,避免抓到未完成内容;
  3. Expires 与 Cache-Control 的 max-age 和内容更新频率匹配,别让页面改动后还要等很久才生效。

一份可以照着做的自查清单

  1. 记录系统、应用、数据库、CDN 四个环节各自的时区,确认它们一致;
  2. 抽查几个页面的响应头,检查 Date 与 Last-Modified 是否合理、是否晚于当前时间;
  3. 从 Sitemap 里取若干 URL,与页面实际更新时间逐条比对;
  4. 把日志时间换算到统一时区,再看一遍抓取时段分布;
  5. 检查定时发布、缓存刷新任务是否按时区正确执行。
蜘蛛不会因为你把 lastmod 改成今天就更频繁地来,但会因为时间戳前后矛盾,而降低对你站点时间信息的信任。

时间戳不是一个装饰字段,它是蜘蛛判断“要不要再来一次”的依据之一。把时区统一、把时间写真实,比反复提交 URL 更省事。