304缓存的原理
服务器首先产生ETag,服务器可在稍后使用它来判断页面是否已经被修改。本质上,客户端通过将该记号传回服务器要求服务器验证其(客户端)缓存。
304(未修改--Not Modified)是HTTP状态码,服务器用来标识这个文件没修改,不返回内容,浏览器在接收到这个状态码后,会使用浏览器已缓存的文件
ETag
ETag HTTP响应头是资源的特定版本的标识符。这可以让缓存更高效,并节省带宽,因为如果内容没有改变,web服务器不需要发送完整的响应。
而如果内容发生了变化,适用ETag有助于防止资源的同时更新相互覆盖("空中碰撞")。
如果给定URL中的资源更改,则一定要生成新的Etag值,因此Etag类似于指纹,也可能被某些服务器用于跟踪。比较etags能快速确定此资源是否变化,
但也可能被跟踪服务器永久存留。
Etag是Entity Tag的缩写,中文译过来就是实体标签的意思。在HTTP1.1协议中其实就是请求HEAD中的一个属性而已。
ETag是HTTP1.1中才加入的一个属性,用来帮助服务器控制web端的缓存验证。它的原来是这样的,当浏览器请求服务器的某项资源(A)时,服务器根据
A算出一个哈希值(43434-de3e3-434fefe434)并通过ETag返回给浏览器,浏览器把哈希值(43434-de3e3-434fefe434)和A同时缓存在本地,
当下次再次向服务器请求A时,会通过类似If-None-Match:'43434-de3e3-434fefe434'的请求头把ETag发送给服务器,服务器再次计算A的哈希值并和
浏览器返回的值做比较,如果发现A发生了变化就把A返回给浏览器(200),如果发现A没有变化就给浏览器返回一个304未修改。这样通过
控制浏览器端的缓存,可以节省服务器的带宽,因为服务器不需要每次都把全量数据返回给客户端。