HTTP中有关缓存的首部字段有哪些?HTTP的浏览器缓存机制

一、Last-Modified和 If-Modified-Since
       简单的说, Last-Modified与 If-Modified- Since都是用于记录页面最后修改时间的HTTP头信息,只是Last-Modified是由服务器往客户端发送的HTTP头,而If-Modified-Since则是由客户端往服务器发送的头,可以看到,再次请求本地在在的缓存页面时,客户端会通过If-Modified-Since头把浏览器端级体页面的最后一次被服务器修改的时间一起发到服务器去,服务器会把这个时与服务器上实际文件的最后修改时间进行比较,通过这个时间最断客户端的面是否是最新如果不是最新的,就返回HTP状态码200和新的文件内容,客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示到浏览器中:如果是最新的则返回304告诉客户端其本地缓存中的页面是最新的,就直接把本地缓存文件显示到浏览器中,这样在网络上传输的数据量就会大大减少,同时也减轻了服务器的负担

1)什么是” Last-Modified”?

       在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个 Last-Modified的属性标记此文件在服务期端最后被修改的时间,格式类似这样:Last-Modified: Fri, 12 May 2006 18: 53: 33 GMT
客户端第二次请求此URL时,洲览器会向服务器传送 Modified-Since报头,询问该时间之后文件是否有被修改过:

       If-Modified-Since: Fri, 12 May 2006 18: 53. 33 GMT
       如果服务端的资源没有变化,则自动返回HTP304状态码,内容为空,这样就节省了传输数据量,当服务器端代码发生改变或着重启服务器时,则重新发出资源,返回和第一次请求时类似,从而保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源
二、ETag和 If-None-Match
       ETag和 If-None-Match是一种常用的判断资源是否改变的方法。类似于Last-Modified和 If-Modified-Since.但是有所不同的是 Last-Modified和 If-Modified-Since只判断资源的最后修改时间,而ETag和 If-None-Match可以是源任的任何属性:比如资源的MD5等。
        ETag和|f-None- Match的工作原理是在 HTTP Response中添加ETags信息,当客户端再次请求该资源时,将在HTTP Request中加入 If-None-Match信息(也就是 ETags的值)·如果服务器验证资源的ETags没有改变(该资源的内容没有改变),将返回一个304状态:否则,服务器将返回200状态,并返回该资源和新的 ETags.
        2)什么是”Etag”?
        服务器会为每个资源分配对应的ETag值,根据资源的内容得到其值,当资源内容发生改变时,其值也会改变。以下是服务器端返回的格式:ETag: 50b1c1d4f775c61: df3"
        客户端的查询更新格式是这样的:
         If-None-Match: W/ 50b1c1d4f775c61: df3"
         如果ETag没改变,则返回状态304,这也和 Last-Modified一样。
         扩展1:Last- Modified和 Etags如何帮助提高性能?
        聪明的开发者会把 Last-Modified和 ETags请求的hp报头一起使用,这样可利用客户端(例如浏览器)的缓存。因为服务器首先产生 Last-Modified/Etag标记,服务器可在稍后使用它宋判断页面是否已经被修改。本质上,客户端通过将该记号传回服务器要求服
务器验证其(客户端)缓存。
        扩展2:既然有了Last- Modified,为什么还要用ETag字段呢?
    1、某些文件修改非常频繁,比如在秒以下的时间内进行修改(比方说1s内修改了N次),If-Modified-Since能检查到的粒度是秒级的,这种修改无法体现。
     2、一些文件也许会周期性的更改,但是他的内容并不改变(仅仅改变的修改时间),这个时我们并不希望客户端认为这个文件被修改了,而重新GET
     3、某些服条器不能精确的得到文件的最后修改时间
     因此,HTTP/1.1利用EntityTag头提供了更加严格的验证。Last-Modified与ETag一起使用时,服务器会优先验证ETag的值。

三、Expires/ Cache-Control(优先使用)
       用来控制缓存的失效日期,控制浏览器是直接从浏览器缓存取数据还是重新发请求到服务器取数据。
       Expires:是Web服务器响应消想头字段,在响应http请求时告诉浏览器在过期时间前浏览器可以直接从浏览器缓存取数据,而无需再次请求。 Expires的一个缺点就是,返回的到期时间是服务器的时间,这样存在一个问题如果客户端的时间与服务器的时间相差很大(比如时钟不同步,或者跨时区),那么误差就很大,所以在HTTP1.1版开始,使用Cache-Control: max-age=(秒)替代
       当服务器发出响应的时候,可以通过两种方式来告诉客户端缓存请求:
       第一种是 Expires,比如:
       Expires: Sun, 16 Oct 2016 05: 43:02 GMT
       在此日期之前,客户端都会认为缓存是有效的。
       不过 Expires有缺点,比如说,服务端和客户端的时间设置可能不同,这就会使缓存失效可能并不能精确的按服务器的预期进行。
       第二种是 Cache-Control,比如:
       Cache-Control: max-age=315360000
       这里声明的是一个相对的秒数,表示从现在起,315360000秒内缓存都是有效的,这样就避免了服务端和客户端时间不一致的问题。
       但是Cache-Control是HTTP1.1才有的,不适用于HTTP1.0,而Expires既适用
HTTP1.0也适用于HTTP1.1所以说在大多数情况下同时发送这两个头会是一个更选择,当客户端两种头都能解析的时候,会优先使用 Cache-Control。

你可能感兴趣的:(TCP与HTTP)