If-Unmodified-Since
用法
客户端包含 If-Unmodified-Since 以防覆盖他人所做的更改。最常见的场景涉及一个 HTTP PUT 或 DELETE 请求,其中客户端需要确保资源仍处于此前所观察到的状态。如果另一个客户端在该头中的日期之后修改了资源,服务器会以 412 Precondition Failed 响应拒绝该请求。
这解决了更新丢失问题。两个客户端获取同一资源、都进行了编辑并都发送更新。若没有前置条件,第二次更新会静默地覆盖第一次。向第二个请求添加 If-Unmodified-Since 可确保服务器检测到冲突。
该头的值使用 HTTP 日期格式。服务器将此日期与资源的 Last-Modified 时间戳比较。当资源的修改日期等于或早于 If-Unmodified-Since 中的值时,条件通过,服务器继续处理。
若需更强的一致性保证,应优先使用带 ETag 值的 If-Match。ETag 提供字节级精度,而基于日期的条件分辨率为一秒。
HTTP-date
其值遵循 IMF-fixdate 格式。该日期表示资源可接受的最新修改时间。
If-Unmodified-Since: <day-name>, <day> <month> <year> <hour>:<minute>:<second> GMT
示例
客户端在 2025 年 2 月 15 日获取了一份文档,现在发送更新。If-Unmodified-Since 值与原始响应中收到的 Last-Modified 日期匹配。如果文档在此时间戳之后发生了变化,服务器以 412 Precondition Failed 响应。
PUT /docs/report.json HTTP/1.1
Host: api.example.re
Content-Type: application/json
If-Unmodified-Since: Sat, 15 Feb 2025 10:30:00 GMT
当与用于分块上传的 Range 请求配对时,If-Unmodified-Since 可确保基础资源在各分块之间未发生变化。
PATCH /files/dataset.csv HTTP/1.1
Host: api.example.re
If-Unmodified-Since: Fri, 14 Feb 2025 08:00:00 GMT
Content-Range: bytes 0-1023/4096