HTTP缓存控制总结
引言
通过网络获取内容既缓慢,成本又高。大的相应需要在客户端和服务器之间多次往返通信,这拖延了浏览器可以使用和处理内容的时间,同时也增加了通信的成本。因此,缓存和重用以前获取到的资源的能力成为性能优化的一个很关键的方面。
与缓存相关的HTTP首部字段主要有哪些
(1)通用首部字段(意味着既能用于请求报文,又能用于响应报文)
字段名称 | 说明 |
Cache-Control | 控制缓存的行为 |
Pragma | http1.0的遗留物,值为"no-cache"时禁用缓存 |
关于Pragma:no-cache,跟Cache-Control: no-cache相同。Pragma: no-cache兼容http 1.0 ,Cache-Control: no-cache是http 1.1提供的。因此,Pragma: no-cache可以应用 到 http 1.0 和http 1.1,而Cache-Control: no-cache只能应用于http 1.1.
(2)请求首部字段
(3)响应首部字段
(4)实体首部字段
这些HTTP首部字段之间的联系和区别
Pargram:设置no-cache禁用cache
Expires:通过时间来控制来告诉浏览器资源缓存过期时间,如果还没过期就不发送请求。
HTTP缓存首部字段的优先级
优先级:Pragram>Cache Control>Expires
HTTP缓存首部字段的特点和局限性
上述的首部字段均能让客户端决定是否向服务器发送请求。为了让客户端与服务器之间更有效的利用缓存,HTTP1.1新增了几个首部字段来做这件事情。
(1)Last-Modified
服务器将资源传递给客户端时,会将资源最后更改的时间以"Last-Modified:GMT"的形式加载实体首部一起返回给客户端。 客户端会为资源标记上该信息,再进行下一次请求的时候,会将"Last-Modified:GMT"这个信息添加到请求中,服务器做检查,如果资源没有被修改过(这个地方自己体会),那么返回304状态码,如果资源修改过,就返回200状态码。
(2)ETag
为了解决"Last-Modified:GMT"可能存在不准确的问题,HTTP1.1还推出了ETag字段。服务器会通过某种算法,给资源加上一个唯一的标识符,把资源返回给客户端时,会在实体首部加上"ETag:标识符"一起返回给客户端,客户端会保留该资源的ETag字段。 当然,客户端再请求时,会将这个ETag带上,服务器只需比较一下ETag是否跟服务器上的一致(除非服务器上的资源发生了更新,否则服务器上该资源的ETag是不会变的)。
用户在不同的页面刷新行为的差别
可以讲用户刷新访问界面的手段分为三类:
(1)在浏览器地址栏输入地址
(2)F5 、点击浏览器工具栏中的刷新按钮 、右键选择重新加载
(3)Ctl+F5
不同的手段网页加载速度是不一样的。他们之间的区别何在呢?假设,浏览器对一个地址没有进行任何的访问,更没有缓存文件。准备工作,地址栏输入网址,首次访问该网页,查看请求与响应信息可以看到请求头部没有任何关于http缓存相关的信息,响应的头部却包含了:
Cache-Control:max-age=31104000
Expires:Thu,20 Jul 2017 02:18:41 GMT
Last-Modified:Fri,15 Jul 2016 04:11:51 GMT
这个时候,浏览器会对这些信息进行缓存,直至该文件过期、用户清空Cache或者用户强制资源刷新。
准备工作完成后,就该比较三者间的区别:
(1)输入地址 浏览器发现该资源已经缓存切没有过期(通过Cache-Control或者Expires头部),没有跟服务器确认,直接使用了了浏览器的缓存。
(2)F5会让浏览器无论如何都发送一个HTTP请求给服务器,但是他的头部会加上浏览器缓存的Last-Modified,服务器判断后,发现没有过期,所以就返回了一个304状态码。这个信息很小,所以页面很快就刷新了。
(3)Ctl+F5是彻底从服务器要一分资源过来。