Date 在说什么
Date 是源服务器生成响应时的绝对时间,格式固定为 IMF-fixdate(例如 Sat, 11 Oct 2026 08:30:00 GMT),且必须用 GMT(RFC 9110 §6.6.1)。它是缓存计算年龄的基准:缓存拿它对比本地时间,推算出这份副本已经存在多久。
缺失会怎样
源服务器通常必须发送 Date;没有时钟的中间缓存可以代为生成。客户端拿到缺失或明显跑偏的 Date 时,新鲜度判断就会失控——表现是该更新的时候不更新,或者刚缓存就立刻失效。
基本信息
| 名称 | Date |
|---|---|
| 作用 | 标注响应生成的时刻 |
| 规范 | RFC 9110 §6.6.1 |
| 格式 | Sat, 11 Oct 2026 08:30:00 GMT(必须 GMT) |
| 相关头 | Age、Expires、Cache-Control |
典型使用场景
- 排查「内容没更新」:对比 Date、Age 与本地时间,推算这份副本的年龄
- 排查缓存提前失效:服务器时钟漂移会让新鲜度计算直接失准
- 判断响应来自源站还是边缘缓存:配合 Via、Server 一起看
- 日志时间线对齐:Date 是响应侧最接近生成时刻的字段
查看与对比
查看与对比
curl -sI https://www.example.com/ | grep -i '^date:' # 看响应生成时间
date -u # 与本机 UTC 时间对比
curl -sI https://www.example.com/ | grep -iE '^(date|age|expires|cache-control):' # 缓存相关头一起看相关头怎么读
| 头部 | 含义 | 读法 |
|---|---|---|
| Date | 源站生成响应的时刻 | 与本机 UTC 偏差大,说明服务端时钟不准 |
| Age | 该副本在缓存中已存在的秒数 | 由缓存添加,源站一般不发送 |
| Expires | 绝对过期时刻 | 老式缓存头,存在 Cache-Control 时以它为准 |
| Cache-Control | 新鲜度与可缓存性策略 | 判断是否命中缓存的主要依据 |
排查缓存时间异常时把 Date、Age、Expires 与 Cache-Control 一起拉出来:只看其中任何一个字段都很容易得出错误结论。
服务器时钟漂移是隐形故障源:它同时影响缓存新鲜度、证书有效期判断与日志排序。开启时间同步并监控偏移量,比事后排查便宜得多。
CDN 通常在回源后按自己的时钟重写 Date 或补发 Date:看到边缘与源站时间不一致时,先分清这个头是源站给的还是边缘改写的。
核对时钟偏移
核对时钟偏移
timedatectl status # 查看系统时间与同步状态
chronyc tracking # 查看当前偏移量与同步源
curl -sI https://www.example.com/ | awk -F': ' 'tolower($1)=="date"{print $2}' # 取服务端时间