RFC2616的13.4节里说,如果没有其他服务器端指令,客户端可以默认对若干GET请求的HTTP响应码(比较知名的如“200 OK”和“301 Moved Permanently”)进行缓存。这些响应甚至可以不限时长地一直缓存下去,只要请求方法和目标URL与之前一致就行,即使其他参数(如Cookie的值)不一样,也可以重用缓存。而使用HTTP授权方式的请求则不能使用缓存,但其他授权认证方式,如Cookie,则未在规范里明确限定。
服务器端将根据请求头里发过来的条件,如果ETag标识符与上次相比没有变化,则响应一个“304 Not Modified”(没有变化)代码,表示无需刷新,又或者根据需要再完整地返回一次该资源的副本。
注意:通过Date/If-Modified-Since和ETag/If-None-Match这两组响应/请求头的搭配,再结合使用Cache-Control:private响应头,就能方便而隐秘地获得浏览器在一段时间内的访问规律和使用习惯。同样地,也可以将一个独一无二的字符串标记嵌到可缓存的JavaScript文件里,然后在访问该文件时,如果请求头里包含了缓存条件,一律答复“304 Not Modified(没有变化)”,也能达到同样的效果。