【问题标题】:What if both If-Modified-Since and If-None-Match are present in HTTP headers如果 HTTP 标头中同时存在 If-Modified-Since 和 If-None-Match 怎么办
【发布时间】:2014-10-08 22:21:18
【问题描述】:

我已经阅读RFC 2616 - sec14.26RFC 2616 - sec13.3.3 很长时间了,但我仍然不确定我是否理解正确。

第 14.26 节指出

如果任何实体标签与实体的实体标签相匹配,该实体标签将在对该资源的类似 GET 请求(没有 If-None-Match 标头)的响应中返回,或者如果给定“*”并且该资源存在任何当前实体,则服务器不得执行请求的方法,除非需要这样做,因为资源的修改日期无法匹配 If-Modified- 中提供的日期由于请求中的 header 字段。相反,如果请求方法是 GET 或 HEAD,服务器应该以 304 (Not Modified) 响应 进行响应,包括匹配的实体之一的缓存相关标头字段(特别是 ETag)。

,

如果没有一个实体标签匹配,那么服务器可以执行请求的方法,就好像 If-None-Match 头字段不存在一样,但也必须忽略任何 If-Modified-Since请求中的标头字段。也就是说,如果没有实体标签匹配,则服务器不得返回 304(未修改)响应

第 13.3.3 节指出

HTTP/1.1 源服务器,在接收到包含 Last-Modified 日期(例如,在 If-Modified-Since 或 If-Unmodified-Since 标头字段中)和一个或多个实体标签(例如, 在 If-Match、If-None-Match 或 If-Range 标头字段中)作为缓存验证器,不得返回 304(未修改)的响应状态,除非这样做与所有条件标头一致请求中的字段。

我很困惑无条件兼容 HTTP 服务器是否应该响应客户端请求 (GET / HEAD) 其中

  1. 条件If-Modified-Since 匹配,但If-None-Match 不匹配。
  2. 或者,条件If-None-Match 匹配,但If-Modified-Since 不匹配。

根据第 14.26 节,第一种情况应返回 304 Not Modified,第二种情况应返回 200 OK,因为 If-Modified-Since 被忽略。

但是第 13.3.3 节说 “它不得返回 304(未修改)的响应状态,除非这样做与请求中的所有条件标头字段一致。”,这意味着在这两种情况下都应该返回 200 OK。

【问题讨论】:

标签: http http-headers


【解决方案1】:

来自 RFC 7232

如果请求包含 If-None-Match 头字段,接收者必须忽略 If-Modified-Since; If-None-Match 中的条件被认为是对 If-Modified-Since 中条件的更准确替代,并且将两者结合起来只是为了与可能无法实现 If-None-Match 的旧中介进行互操作。

【讨论】:

    猜你喜欢
    • 2012-11-27
    • 2023-03-31
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 2011-07-02
    • 2012-11-01
    相关资源
    最近更新 更多