当 HTTP 请求包含 If-XXX 这种样式的首部时,服务器会对附带的条件进行判断,只有判断指定条件为真,才会执行请求。这样的请求首部有五个,分别是 If-Modified-Since、If-Unmodified-Since、If-Match、If-None-Match 和 If-Range。
If-Modified-Since
当使用 GET 方法请求服务器上的资源时指定了 If-Modified-Since 首部时,如果该资源在指定的日期时间之后未被修改过,服务器会回送一条 304 Not Modified 响应,而不会回送此资源。如果对象被修改过,服务器就会像对待非条件 GET 请求一样响应。
a) 资源在指定的日期时间之后未被修改过
[huey@huey-K42JE ~]$ curl -I -H "If-Modified-Since: Fri, 09 Aug 2013 23:54:35 GMT" http://common.cnblogs.com/script/jquery.js HTTP/1.1 304 Not Modified Date: Tue, 08 Sep 2015 06:38:40 GMT Connection: keep-alive Cache-Control: public,max-age=25920000 Accept-Ranges: bytes ETag: "7468b58329bce1:0"
b) 资源在指定的日期时间之后被修改过
[huey@huey-K42JE ~]$ curl -I -H "If-Modified-Since: Fri, 15 Feb 2013 03:00:00 GMT" http://common.cnblogs.com/script/jquery.js HTTP/1.1 200 OK Date: Tue, 08 Sep 2015 06:43:02 GMT Content-Type: application/javascript Content-Length: 94020 Connection: keep-alive Vary: Accept-Encoding Cache-Control: public,max-age=25920000 Last-Modified: Fri, 15 Feb 2013 03:06:57 GMT Accept-Ranges: bytes ETag: "7468b58329bce1:0"
If-Unmodified-Since
If-Unmodified-Since 首部的作用与 If-Modified-Since 首部的作用相反。当使用 GET 方法请求服务器上的资源时指定了 If-Unmodified-Since 首部时,如果该资源在指定的日期时间之后被修改过,服务器会回送一条 412 Precondition Failed 响应,而不会回送此资源。如果对象未被修改过,服务器就会像对待非条件 GET 请求一样响应。
a) 资源在指定的日期时间之后未被修改
[huey@huey-K42JE ~]$ curl -I -H "If-Unmodified-Since: Fri, 09 Aug 2013 23:54:35 GMT" http://common.cnblogs.com/script/jquery.js HTTP/1.1 200 OK Date: Tue, 08 Sep 2015 06:49:51 GMT Content-Type: application/javascript Content-Length: 94020 Connection: keep-alive Vary: Accept-Encoding Cache-Control: public,max-age=25920000 Last-Modified: Fri, 15 Feb 2013 03:06:57 GMT Accept-Ranges: bytes ETag: "7468b58329bce1:0"
b) 资源在指定的日期时间之后被修改过
[huey@huey-K42JE ~]$ curl -I -H "If-Unmodified-Since: Fri, 15 Feb 2013 03:00:00 GMT" http://common.cnblogs.com/script/jquery.js HTTP/1.1 412 Precondition Failed Date: Tue, 08 Sep 2015 06:50:12 GMT Content-Type: text/html Content-Length: 1333 Connection: keep-alive Cache-Control: public,max-age=25920000 Last-Modified: Fri, 15 Feb 2013 03:06:57 GMT Accept-Ranges: bytes ETag: "7468b58329bce1:0"
If-Match
当使用 GET 方法请求服务器上的资源时指定了 If-Match 首部时,只有该资源的 ETag 值与指定的值一致,服务器才会执行请求。否则,服务器会回送一条 412 Precondition Failed 响应。还可以使用星号(*)指定 If-Match 的字段值,服务器将会忽略 ETag 的值,只要资源存在就处理请求。
a) 资源的 ETag 值与 If-Match 指定的值一致
[huey@huey-K42JE ~]$ curl -I -H 'If-Match: "7468b58329bce1:0"' http://common.cnblogs.com/script/jquery.js HTTP/1.1 200 OK Date: Tue, 08 Sep 2015 07:42:40 GMT Content-Type: application/javascript Content-Length: 94020 Connection: keep-alive Vary: Accept-Encoding Cache-Control: public,max-age=25920000 Last-Modified: Fri, 15 Feb 2013 03:06:57 GMT Accept-Ranges: bytes ETag: "7468b58329bce1:0"
b) 资源的 ETag 值与 If-Match 指定的值不一致
[huey@huey-K42JE ~]$ curl -I -H 'If-Match: "7468b58329bce2:0"' http://common.cnblogs.com/script/jquery.js HTTP/1.1 412 Precondition Failed Date: Tue, 08 Sep 2015 07:43:32 GMT Content-Type: text/html Content-Length: 1333 Connection: keep-alive Cache-Control: public,max-age=25920000 Last-Modified: Fri, 15 Feb 2013 03:06:57 GMT Accept-Ranges: bytes ETag: "7468b58329bce1:0"
c) 使用星号(*)指定 If-Match 的字段值
[huey@huey-K42JE ~]$ curl -I -H 'If-Match: *' http://common.cnblogs.com/script/jquery.js HTTP/1.1 200 OK Date: Tue, 08 Sep 2015 07:44:00 GMT Content-Type: application/javascript Content-Length: 94020 Connection: keep-alive Vary: Accept-Encoding Cache-Control: public,max-age=25920000 Last-Modified: Fri, 15 Feb 2013 03:06:57 GMT Accept-Ranges: bytes ETag: "7468b58329bce1:0"
If-None-Match
If-None-Match 首部的作用与 If-Match 首部一致。当使用 GET 方法请求服务器上的资源时指定了 If-None-Match 首部时,只有该资源的 ETag 值与指定的值不一致,服务器才会执行请求。否则,服务器会回送一条 304 Not Modified 响应。
a) 资源的 ETag 值与 If-None-Match 指定的值一致
[huey@huey-K42JE ~]$ curl -I -H 'If-None-Match: "7468b58329bce1:0"' http://common.cnblogs.com/script/jquery.js HTTP/1.1 304 Not Modified Date: Tue, 08 Sep 2015 09:02:56 GMT Connection: keep-alive Cache-Control: public,max-age=25920000 Accept-Ranges: bytes ETag: "7468b58329bce1:0"
b) 资源的 ETag 值与 If-None-Match 指定的值不一致
[huey@huey-K42JE ~]$ curl -I -H 'If-None-Match: "7468b58329bce2:0"' http://common.cnblogs.com/script/jquery.js HTTP/1.1 200 OK Date: Tue, 08 Sep 2015 09:04:31 GMT Content-Type: application/javascript Content-Length: 94020 Connection: keep-alive Vary: Accept-Encoding Cache-Control: public,max-age=25920000 Last-Modified: Fri, 15 Feb 2013 03:06:57 GMT Accept-Ranges: bytes ETag: "7468b58329bce1:0"
If-Range
当使用 GET 方法请求服务器上的资源时指定了 If-Range 首部时,如果该资源的 ETag 值或时间与指定的值相一致,则作为范围请求处理。反之,则返回整个资源。