我已经阅读了RFC 2616 - sec14.26和RFC 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)
If-Modified-Since匹配,但If-None-Match没有.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的旧中间人互操作而组合.