1. Last-Modified / If-Modified-Since
客户端请求发出请求,服务端会将 Last-Modified 发给客户端,Last-Modified 表示资源的最后修改时间。
客户端再次请求的时候,会将资源的最后修改时间通过 If-Modified-Since 请求头部,发给服务端,服务端通过这个值判断资源是否已经修改了:
* 如果真的被修改: 那么就开始传输, 服务器返回:200 OK
* 如果没有被修改: 那么就无需传输, 服务器返回: 304 Not Modified.
http方法:HEAD、GET
主要用途:客户端尝试下载最新版本的资源,比如网页刷新、加载图片之类。
2. Last-Modified / If-Unmodified-Since
和上面 If-Modified-Since 类似,也为了服务端判断文件是否被修改:
* 如果没有被修改: 则开始继续传送文件: 服务器返回: 200 OK
* 如果文件被修改: 则不传输, 服务器返回: 412 Precondition failed (预处理错误)
http方法:POST, PUT, DELETE
主要用途:断点续传(一般会指定Range参数)。 要想断点续传,那么文件就一定不能被修改,否则就不是同一个文件了,断点续传就没有意义了。
3. ETag / If-None-Match
Last-Modified / If-Modified-Since 主要缺点就是它只能精确到秒的级别,一旦在一秒的时间里出现了多次修改,那么Last-Modified / If-Modified-Since是无法体现的。
ETag / If-None-Match没有使用时间作为判断标准,而是使用一个特征串。
会把上次服务端响应的特征串作为If-None-Match的值发送给服务端,服务端可以通过这个值来判断是否需要从重新发送,如果不需要,就简单的发送一个304状态码,客户端将从缓存里直接读取所需的Web组件。
http方法:HEAD、GET
主要用途:和 Last-Modified / If-Modified-Since 类似
4. ETag / If-Match
类似 Last-Modified / If-Unmodified-Since,也为了服务端判断文件是否被修改
http方法:POST, PUT, DELETE
主要用途:断点续传(一般会指定Range参数)
5. Expires
Expires是一个时间,比如:Expires: Sun, 16 Oct 2017 05:43:02
。
这是服务端返回给客户端的头部,告诉客户端数据在这个时间之前都是有效的。
6. Cache-Control
Cache-Control: max-age=3600
这里声明的是一个相对的秒数,表示从现在起,3600秒内缓存都是有效的,这样就避免了服务端和客户端时间不一致的问题,但是Cache-Control是HTTP1.1才有的,不适用与HTTP1.0。
ref
http://tech110.blog.51cto.com/438717/549764
http://www.cnblogs.com/memset/p/http_if_modified_since.html
http://tech110.blog.51cto.com/438717/549764
https://tools.ietf.org/html/rfc7232#section-3.1