HTTP Date标头背后的基本原理是什么?

时间:2009-10-22 22:05:45

标签: http date header

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

但有什么用它可以在单独的Date标题中加倍信息?

3 个答案:

答案 0 :(得分:35)

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;

答案 1 :(得分:-1)

请考虑不要使用“禁止的标头名称” 列表中的Date标头。

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


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

禁止修改此类标头,因为用户代理保留对其的完全控制权。保留以Sec-开头的名称,以便使用Fetch从API安全地创建新的标头,从而使开发人员可以控制标头,例如XMLHttpRequest。

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

  • 接受字符集
  • 列表项
  • 接受编码
  • 访问控制请求标头
  • 访问控制请求方法
  • 连接
  • 内容长度
  • 饼干
  • Cookie2
  • 日期
  • DNT
  • 期望
  • 主机
  • 保持生命
  • 来源
  • 代理-
  • 秒-
  • 推荐人
  • TE
  • 拖车
  • 传输编码
  • 升级
  • 通过

答案 2 :(得分:-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和网络。