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

Wen*_* Ji 9 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不匹配.

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

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

SKi*_*ng7 12

来自RFC 7232

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