我已经阅读了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(未修改)的响应状态,除非这样做与请求中的所有条件头字段一致。&#34 ; ,意味着在两种情况下都应该返回200 OK。
答案 0 :(得分:11)
来自RFC 7232
收件人必须忽略If-Modified-因为如果请求包含If-None-Match标头字段; If-None-Match中的条件被认为是If-Modified-Since中条件的更准确的替代,并且这两个条件仅为了与可能不实现If-None-Match的旧中间人互操作而组合。