【发布时间】:2010-12-09 06:38:23
【问题描述】:
我已阅读 RFC 2616,但我仍然想知道 Date 字段的用途。有 Last-Modified 字段,实际上除了提供元数据之外还有其他意义,即用于缓存('If-Modified-Since')。
但是将单独的 Date 标头中的信息加倍有什么用呢?
【问题讨论】:
-
类似的问题有一些很好的答案stackoverflow.com/questions/4726515/…
我已阅读 RFC 2616,但我仍然想知道 Date 字段的用途。有 Last-Modified 字段,实际上除了提供元数据之外还有其他意义,即用于缓存('If-Modified-Since')。
但是将单独的 Date 标头中的信息加倍有什么用呢?
【问题讨论】:
根据the spec,它用于年龄计算。如果您不知道服务器认为现在是什么时间,您将无法计算资源的“年龄”。以下是规范中的相关文本:
年龄计算算法总结,当缓存收到响应时:
age_value
是 Age: 缓存接收到的标头的值 这个回应。
date_value
是源服务器的Date:标头的值
request_time
是缓存发出请求的(本地)时间 这导致了这个缓存的响应
response_time
是缓存接收到的(本地)时间 回应
now
是当前(本地)时间apparent_age = max(0, response_time - date_value); corrected_received_age = max(apparent_age, age_value); response_delay = response_time - request_time; corrected_initial_age = corrected_received_age + response_delay; resident_time = now - response_time; current_age = corrected_initial_age + resident_time;
【讨论】:
Date 仅用于更好地工作 Expires 标头:
Date: Mon, 26 Mar 2012 12:53:02 GMT
Expires: Wed, 25 Apr 2012 12:53:02 GMT
服务器或客户端的时间可能不正确,因此客户端(浏览器)尝试calculate max age of the resource freshness。
这就是引入Cache-Control 标签的原因之一。
它使用秒来过期,而不是固定时间。
我测试了 Chrome 和 Firefox,它们很好的是没有 Date 标头的响应,因此可以安全地省略它,除非您仍在使用过时的 Expires 标头。如果Date 丢失,只需assumed the same as client's time。
在规范中,标题是强制性的,这简直太疯狂了:日期格式化/解析会消耗 CPU 和网络。
【讨论】:
请考虑不要使用Date 标头,因为它在“禁止标头名称”列表中。
MDN web docs 中的以下描述可能会有所帮助:
禁止的标头名称是任何不能以编程方式修改的 HTTP 标头的名称;具体来说,一个 HTTP 请求标头名称(与 Forbidden 响应标头名称相反)。
禁止修改此类标头,因为用户代理保留对它们的完全控制。以Sec- 开头的名称保留用于使用 Fetch 创建新的标头,使其不受 API 的影响,从而授予开发人员对标头的控制权,例如 XMLHttpRequest。
禁止的标头名称以 Proxy- 或 Sec- 开头,或者是以下名称之一:
【讨论】:
fetch()/client-side JS 上下文中的使用。不过,这不是我的问题范围。 date 标头非常适合在服务器端使用。只是,服务器(nginx、Apache 等)通常会自动添加它。