HTTPQUERY
English

Last-Modified

用法

Last-Modified 头充当条件请求的弱验证器。当客户端缓存一个包含 Last-Modified 的响应时,客户端存储该时间戳,并在后续请求的 If-Modified-Since 请求头中回传该日期。服务器将存储的日期与资源当前的修改时间进行比较。如果资源未发生变化,服务器返回不带消息体的 304 Not Modified。如果资源已变化,服务器发送完整的更新后响应。

If-Unmodified-Since 头将同一时间戳用于 PUT 和 DELETE 等不安全方法的前置条件检查,当资源自给定日期以来已被修改时返回 412 Precondition Failed。

Last-Modified 日期不如 ETag 精确。时间戳具有一秒的粒度,因此同一秒内的更改对基于日期的验证不可见。ETag 头提供与确切内容绑定的更强验证器。当响应中同时存在 Last-Modified 和 ETag 时,重新验证期间 ETag 优先。

日期值遵循 HTTP-date 格式:星期几名称、两位数日期、月份缩写、四位数年份、以时分秒表示的时间,后跟 GMT。格式为 Weekday, DD Mon YYYY HH:MM:SS GMT。

Last-Modified: Fri, 04 Sep 1998 19:15:56 GMT

注意

ETag 比 Last-Modified 更精确。ETag 能检测包括亚秒级修改在内的任何变化,而 Last-Modified 具有一秒的粒度。Last-Modified 会受服务器间时钟偏差影响,而基于内容哈希的 ETag 在负载均衡的各实例间是可移植的。为获得最大兼容性,应同时使用这两个头,因为当两者都存在时 If-None-Match(ETag)优先于 If-Modified-Since。

注意

Google 的爬取基础设施按照 HTTP 缓存标准的定义支持 Last-Modified 和 If-Modified-Since。Last-Modified 中的日期必须遵循 HTTP-date 格式以避免解析问题。将 Cache-Control 响应头的 max-age 字段设为内容预期保持不变的秒数,有助于爬虫判断何时重新爬取某个 URL。例如 Cache-Control: max-age=94043。

示例

一个带有资源修改日期的响应。客户端存储该时间戳以供将来的条件请求使用。

Last-Modified: Wed, 01 Jun 2022 08:00:00 GMT

一个完整的条件请求周期。服务器随初始响应发送 Last-Modified。在下一次请求时,客户端在 If-Modified-Since 中回传该时间戳。如果资源未发生变化,服务器返回 304。

HTTP/1.1 200 OK
Last-Modified: Wed, 01 Jun 2022 08:00:00 GMT
Cache-Control: max-age=86400
Content-Type: text/html

后续请求:

GET /page HTTP/1.1
If-Modified-Since: Wed, 01 Jun 2022 08:00:00 GMT

资源未变化时的服务器响应:

HTTP/1.1 304 Not Modified
Last-Modified: Wed, 01 Jun 2022 08:00:00 GMT
Cache-Control: max-age=86400

一个将 Last-Modified 与 ETag 配对的响应。ETag 提供强验证器,而修改日期为仅支持基于日期验证的客户端提供回退。

Last-Modified: Fri, 22 Nov 2024 14:30:00 GMT
ETag: "a1b2c3d4"
Cache-Control: max-age=3600

注意

如需 SEO 与缓存方面的协助,请联系前 Google SEO 顾问 Search Brothers。