当 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 值或时间与指定的值相一致,则作为范围请求处理。反之,则返回整个资源。

HTTP - 条件请求的更多相关文章

  1. ASP.NET Core应用针对静态文件请求的处理[2]: 条件请求与区间请求

    通过调用ApplicationBuilder的扩展方法UseStaticFiles注册的StaticFileMiddleware中间件帮助我们处理针对文件的请求.对于StaticFileMiddlew ...

  2. ASP.NET Core应用针对静态文件请求的处理[5]: DefaultFilesMiddleware中间件如何显示默认页面

    DefaultFilesMiddleware中间件的目的在于将目标目录下的默认文件作为响应内容.我们知道,如果直接请求的就是这个默认文件,那么前面介绍的StaticFileMiddleware中间件会 ...

  3. ASP.NET Core应用针对静态文件请求的处理[4]: DirectoryBrowserMiddleware中间件如何呈现目录结构

    和StaticFileMiddleware中间件一样,DirectoryBrowserMiddleware中间本质上还是定义了一个请求地址与某个物理目录之间的映射关系,而目标目录体现为一个FilePr ...

  4. ASP.NET Core应用针对静态文件请求的处理[3]: StaticFileMiddleware中间件如何处理针对文件请求

    我们通过<以Web的形式发布静态文件>和<条件请求与区间请求>中的实例演示,以及上面针对条件请求和区间请求的介绍,从提供的功能和特性的角度对这个名为StaticFileMidd ...

  5. ASP.NET Core应用针对静态文件请求的处理[1]: 以Web的形式发布静态文件

    虽然ASP.NET Core是一款"动态"的Web服务端框架,但是在很多情况下都需要处理针对静态文件的请求,最为常见的就是这对JavaScript脚本文件.CSS样式文件和图片文件 ...

  6. http协议(八)请求首部字段

    请求首部字段 定义:请求首部字段是从客户端到服务器发送请求报文中所使用的字段,里面包含了附加信息.客户端信息以及对响应内容相关的优先级等内容 1.Accept 通知服务器用户代理可处理的媒体类型及媒体 ...

  7. StaticFileMiddleware中间件如何处理针对文件请求

    StaticFileMiddleware中间件如何处理针对文件请求 我们通过<以Web的形式发布静态文件>和<条件请求与区间请求>中的实例演示,以及上面针对条件请求和区间请求的 ...

  8. dhtmlxGrid分页查询,条件查询实例

    使用jquery的ajax get将页面条件请求到后台,取得数据库数据,分页查询,返回前台grid中. 引入所需文件: <script>window.dhx_globalImgPath = ...

  9. C#HttpWebResponse请求常见的状态码

    成员名称 说明 Continue 等效于 HTTP 状态 100.Continue 指示客户端可能继续其请求. SwitchingProtocols 等效于 HTTP 状态 101.Switching ...

随机推荐

  1. POJ 3670 Eating Together (DP,LIS)

    题意:给定 n 个数,让你修改最少的数,使得它变成一个不下降或者不上升序列. 析:这个就是一个LIS,但是当时并没有看出来...只要求出最长LIS的长度,用总数减去就是答案. 代码如下: #inclu ...

  2. Python 3.2: 使用pymysql连接Mysql

    在python 3.2 中连接MYSQL的方式有很多种,例如使用mysqldb,pymysql.本文主要介绍使用Pymysql连接MYSQL的步骤 1        安装pymysql ·       ...

  3. 高扩展的基于NIO的服务器架构

    当你考虑写一个扩展性良好的基于Java的服务器时,相信你会毫不犹豫地使用Java的NIO包.为了确保你的服务器能够健壮.稳定地运行,你可能会花大量的时间阅读博客和教程来了解线程同步的NIO selec ...

  4. linx目录结构

    linux中的命令一般存放在/bin目录下的: 以下为linux下的基本目录结构和作用: /根目录./boot引导程序,内核等存放的目录./sbin超级用户可以使用的命令的存放目录./bin普通用户可 ...

  5. ADO.NET 快速入门(十四):使用 SQL Server 检索数据

    SqlDataReader 类提供了一种从数据源读取数据记录只进流的方法.如果想使用 OLE DB 接口的数据库或者 SQL Server7.0 之前的版本,请参考文章:使用 OLE DB 检索数据. ...

  6. PC/UVa 题号: 110101/100 The 3n+1 problem (3n+1 问题)

     The 3n + 1 problem  Background Problems in Computer Science are often classified as belonging to a ...

  7. PL/pgSQL学习笔记之二

    39.1.1 使用 PL/pgSQL的好处 SQL是 PostgreSQL和其他大多数关系型数据库作为查询语言而使用的语言.它可移植,并容易学习.但是SQL语句必须被数据库服务器逐条地执行. 这意味着 ...

  8. 在WCF中不使用svc文件直接使用cs文件

    在 配置中有个节点可以实现 此功能 <serviceHostingEnvironment multipleSiteBindingsEnabled="true" > &l ...

  9. 最简单的视频编码器:编译(libx264,libx265,libvpx)

    ===================================================== 最简单的视频编码器系列文章列表: 最简单的视频编码器:编译 最简单的视频编码器:基于libx ...

  10. 设置EXCEL2010打开多个独立窗口

            最近发现一个奇怪的问题,发现office中的word和ppt在我使用笔记本分屏幕(双屏)的时候都可以将2份文档分别在2个窗口打开,但是在使用excel的时候却发现不行,最后研究发现原因 ...