《http权威指南》读书笔记 四
缓存
缓存的再验证:
由于原始服务器上的文件随时可能会变化,因此缓存需要不时的对其进行检测,对比本地的缓存是否与原始服务器上的相同,这种“新鲜度检测”即为再验证。
再验证进行的频率:
大部分缓存只有在客户端发起请求,并且本地缓存副本旧的足以需要检测的时候,才会进行再验证。
验证缓存时,会向服务端发送一个很小的验证请求,如果内容没有变化(即缓存有效),服务器会返回一个304 Not Modified。
缓存再验证工具:If-Modified-Since首部
将If-Modified-Since首部添加在GET请求中时,表示只有在缓存了对象的副本,但是对该副本进行了修改的情况下,服务器才会返回该对象。
服务器内容未修改:返回304 Not Modified
服务器内容被修改:返回带有HTTP 200 OK的普通相应
服务器内容已删掉:返回404 Not Found
http的date首部:date后面的日期是原始服务器第一次响应该请求时的时间。
缓存新鲜度的保持:Expires和Cache-Control:max-age方法
Expires和Cache-Control:max-age都是为缓存有效期设定一个时间。两者不同的是Expires设定的是一个绝对时间,而Cache-Control:max-age设定的是一个以秒为单位的相对时间。
例:
Cache-Control:max-age=3600 表示服务器从第一次产生一个请求的文档起,3600秒后该文档的缓存失效。
Expires:Tue, 05 May 2015 06:29:00 GMT 表示缓存在2015年5月5日6:29:00(格林尼治时间,北京时间需加8)失效。
如果缓存内容超过了以上方法设定的时间,需要与服务器进行再验证。
缓存再验证需要的两个条件首部:If-Modified-Since:和If-None-Match:
1、If-Modified-Since:如果在指定的日期之后,文档被修改过,就会向服务器发出请求。
如果在指定的日期后,文档被修改,那么If-Modified-Since条件就为真,然后执行GET请求,得到一个新的日期。
如果指定的日期后,文档没有被修改,那么If-Modified-Since条件就为假,服务端会返回一个304 Not Modified,不会返回报文主体。
2、If-None-Match:服务器对每个文档设置一个特殊的标签(ETag),如果缓存文档标签与该文档在服务器中的标签不同(并不是根据文档的修改时间),If-None-Match首部就会执行所请求的方法。
如果客户端请求首部包含If-None-Match:"v1.0" 条件,服务端会将If-None-Match后面的ETag标签"v1.0"与本地文档的ETag标签对比。如果相同,则返回304 Not Modified,并且响应报文中包含:ETag:"v1.0";如果ETag标签不同,则返回200 OK以及新的ETag。
If-None-Match:后面可以包含多个ETag标签。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。