一个带有If-Modified-Since头字段且没有Range头字段的GET方法只要求标识的实体在If-Modified-Since头字段给出的日期之后被修改,才会被传递。确定这一点的算法包括下列情况:
a) 如果请求通常不会导致200 (OK)状态,或者传递的If-Modified-Since日期无效,则响应与普通GET完全相同。晚于服务器当前时间的日期无效。
b) 如果该变体自If-Modified-Since所携带的日期以来进行了修改,则响应与普通GET完全相同。
c)如果该变体在有效的If-Modified-Since日期之后没有被修改,服务器应该返回304(没有修改)响应。
这个特性的目的是允许以最少的事务开销来更高效地更新缓存的信息。
注意:Range请求头字段会修改If-Modified-Since的含义。详情请见小节。
注意:因为时间是由服务器确定的,服务器的时间可能与客户端的时间不同步。
注意:在处理If-Modified-Since头字段时,一些服务器将使用精确的日期比较函数而不是小于函数来决定是否发送304(未修改)响应。为了获得最好的结果,当发送一个If-Modified-Since头字段来进行缓存验证时,建议客户端尽可能使用在上一个Last-Modified头字段中收到的确切日期字符串。
注意:如果客户端在If-Modified-Since头字段中使用任意日期,而不是使用从同一个请求的Last-Modified头字段中提取的日期,那么客户端应该知道这个日期是用服务器中的时间来做为解释的。由于客户端和服务器之间的时间并不相同,客户端需要考虑不同步时钟和舍入问题。这包括,如果文档在第一次请求的时间和后续请求中存在If-Modified-Sinc日期之间发生了更改,那么可能存在竞态条件;如果If-Modified-Since日期来自客户端的时钟,且并没有修改服务器的时钟,则可能存在时钟偏移相关的问题。由于网络延迟,客户端和服务器之间的不同时间间隔即使在修正后也不可能完全一样。
一个请求中是否可以同时存在If-Match字段和If-None-Match或If-Modified-Since头字段在本规范中并未定义。
14.26 If-None-MatchIf-None-Match请求头字段需要与一个使其成为“条件”的方法一起使用。拥有一个或多个先前从资源中获得的实体的客户端可以通过在If-None-Match头字段中包含相关实体标记的列表来验证这些实体都不是当前的。这个特性的目的是允许以最少的事务开销来高效地更新缓存的信息。它还用于防止客户端认为资源不存在时在无意中使用一些方法修改现有资源(例如PUT)。
作为一种特殊情况,“*”值匹配资源的任何当前实体。
If-None-Match = "If-None-Match" ":" ( "*" | 1#entity-tag )
如果任何实体标记匹配该实体标记,那么将会导致在使用一个类似GET请求(不具有If-None-Match请求头)下的资源被返回,或者给出的If-None-Match请求头字段的值时*号并且当前存在任何属于该资源的实体,除非必要否则服务器一定不能执行所请求的方法,因为在If-Modified-Since请求头字段中资源的修改日期是不匹配的。。相反,如果请求方法是GET或HEAD,服务器应该使用304(未修改)响应进行响应,包括与缓存相关的头字段(特别是与ETag匹配的一个实体)。对于所有其他请求方法,服务器必须以412状态响应(Precondition Failed)。
有关如何确定两个实体标记是否匹配的规则,请参阅第节。弱比较函数只能用于GET或HEAD请求。
如果实体标记都不匹配,那么服务器可以执行请求的方法,就好像If-None-Match头字段不存在一样,但是必须忽略请求中存在的任何If-Modified-Since头字段。也就是说,如果没有实体标记匹配,服务器就不能返回304(Not Modified)响应。
如果请求在没有If-None-Match头字段的情况下,结果不是2xx或304状态,则必须忽略If-None-Match标头。(请参阅第节,了解在同一请求中同时出现If-Modified-Since和If-None-Match时的服务器行为。)
“If-None-Match: *”的意思是,如果原始服务器(或缓存可能使用变体机制,请参见节)选择的表示存在,则不能执行该方法,如果表示不存在,则应该执行该方法。这个特性用于防止PUT操作之间的竞争。
例子:
If-None-Match: "xyzzy"
If-None-Match: W/"xyzzy"
If-None-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
If-None-Match: W/"xyzzy", W/"r2d2xxxx", W/"c3piozzzz"
If-None-Match: *
一个请求中是否可以同时存在If-Match字段和If-None-Match或If-Modified-Since头字段在本规范中并未定义。
14.27 If-Range