如果HTTP标头中存在If-Modified-Since和If-None-Match,该怎么办?

时间:2014-08-15 06:19:56

标签: http http-headers

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

第14.26条指出

  

如果任何实体标记与该资源上对类似GET请求(没有If-None-Match标头)的响应中返回的实体的实体标记匹配,或者如果" *"给出并且该资源存在任何当前实体,然后服务器必须不执行所请求的方法,除非需要这样做,因为资源的修改日期与If-Modified-Since中提供的日期不匹配请求中的标头字段。相反,如果请求方法是GET或HEAD,则服务器应该使用 304(未修改)响应进行响应,包括匹配的其中一个实体的与缓存相关的头字段(特别是ETag)。

  

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

,第13.3.3节指出

  

HTTP / 1.1源服务器,在接收到包括最后修改日期(例如,在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没有。
  3. 根据第14.26节,在第一种情况下应返回304 Not Modified,在第二种情况下应返回200 OK,因为If-Modified-Since被忽略。

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

1 个答案:

答案 0 :(得分:11)

来自RFC 7232

  

收件人必须忽略If-Modified-因为如果请求包含If-None-Match标头字段; If-None-Match中的条件被认为是If-Modified-Since中条件的更准确的替代,并且这两个条件仅为了与可能不实现If-None-Match的旧中间人互操作而组合。