【问题标题】:What's the rationale behind the HTTP Date header?HTTP Date 标头背后的基本原理是什么?
【发布时间】:2010-12-09 06:38:23
【问题描述】:

我已阅读 RFC 2616,但我仍然想知道 Date 字段的用途。有 Last-Modified 字段,实际上除了提供元数据之外还有其他意义,即用于缓存('If-Modified-Since')。

但是将单独的 Date 标头中的信息加倍有什么用呢?

【问题讨论】:

标签: http date header


【解决方案1】:

根据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不一定和上次修改的一样呢?如果我理解正确,它更多的是“服务器何时开始发送这些东西?”。这是有道理的......
  • @Boldewyn 没错 - 它是“消息的发起日期和时间”。
  • @DanielLubarov 毫无价值,因为它不仅仅是可以发送 Date 标头的响应。它也支持请求,在客户端上建立时间会很有用。不幸的是,它通常不是我所看到的设置
  • 当您说“消息发出的日期和时间”时,该消息是什么?
  • 表示服务器已经向客户端发送了响应。
【解决方案2】:

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 和网络。

【讨论】:

【解决方案3】:

请考虑不要使用Date 标头,因为它在“禁止标头名称”列表中

MDN web docs 中的以下描述可能会有所帮助:


禁止的标头名称是任何不能以编程方式修改的 HTTP 标头的名称;具体来说,一个 HTTP 请求标头名称(与 Forbidden 响应标头名称相反)。

禁止修改此类标头,因为用户代理保留对它们的完全控制。以Sec- 开头的名称保留用于使用 Fetch 创建新的标头,使其不受 API 的影响,从而授予开发人员对标头的控制权,例如 XMLHttpRequest。

禁止的标头名称以 Proxy- 或 Sec- 开头,或者是以下名称之一:

  • 接受字符集
  • 列表项
  • 接受编码
  • 访问控制请求标头
  • 访问控制请求方法
  • 连接
  • 内容长度
  • 饼干
  • Cookie2
  • 日期
  • DNT
  • 期待
  • 主机
  • 保持活动状态
  • 原产地
  • 代理-
  • 秒-
  • 参考
  • TE
  • 预告片
  • 传输编码
  • 升级
  • 通过

【讨论】:

  • 嗯,该列表指的是在 AJAX/fetch()/client-side JS 上下文中的使用。不过,这不是我的问题范围。 date 标头非常适合在服务器端使用。只是,服务器(nginx、Apache 等)通常会自动添加它。
猜你喜欢
  • 1970-01-01
  • 2017-03-09
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
  • 2012-06-27
  • 2019-04-01
  • 2015-04-25
相关资源
最近更新 更多