如果客户端发送的是一个条件验证(Conditional Validation)请求,则web服务器可能会返回HTTP/304响应,这就表明了客户端中所请求资源的缓存仍然是有效的,也就是说该资源从上次缓存到现在并没有被修改过。
条件请求 可以在确保客户端的资源是最新的同时避免因每次都请求完整资源给服务器带来的性能问题。
无条件请求 则保证每次请求返回的都是完整的资源。
如何辨别条件请求?通过下面来加深理解条件请求与无条件请求。
当客户端缓存了目标资源但不确定该缓存资源是否是最新版本的时候,就会发送一个条件请求。
在Fiddler中,你可以在 Inspector > Headers 查找相关请求头,这样就可以辨别出一个请求是否是条件请求。
在进行条件请求时,客户端会提供给服务器一个If-Modified-Since请求头,其值为服务器上次返回的Last-Modified响应头中的日期值,还会提供一个If-None-Match请求头,值为服务器上次返回的ETag响应头的值:
服务器会读取到请求头中这两个的值,判断出客户端缓存的资源是否是最新的:
1)如果是的话,服务器就会返回HTTP/304 Not Modified响应,但没有响应体。客户端收到304响应后,就会从缓存中读取对应的资源。
2)如果服务器认为客户端缓存的资源已经过期了,那么服务器就会返回HTTP/200 OK响应,响应体就是该资源当前最新的内容。客户端收到200响应后,就会用新的响应体覆盖掉旧的缓存资源。
注意:
只有在客户端缓存了对应资源且该资源的响应头中包含了Last-Modified或ETag的情况下,才可能发送条件请求。
如果不改变网站内容,让Fiddler不返回304而返回一个包含响应体的HTTP/200响应,此时就可以用无条件重发。(省略条件请求头来实现无缓存请求)