缓存协商:Last-Modified 与 ETag
究竟要不要使用浏览器的本地缓存,服务器和浏览器之间有一个沟通的机制,叫做缓存协商,一种是Last-modified,一种就是Etag。
Last-Modified
浏览器发出一个请求,对于一般的静态内容,服务器端都会通过文件进行stat()系统调用,获取该文件的最后修改时间,然后放入了HTTP的响应头的信息。下一次浏览器再次发送请求的时候,就会在HTTP请求头上面加上一个 (If-Modified-SinceFri, 25 Mar 2011 07:55:33 GMT )这样的标记,服务器再次接受到这个请求的时候,就会将文件的Last-modified时间和HTTP请求的时间的进行对于,如果木有发生变化,返回状态为304 Not Modified的响应。
ETag
另一种协商方法,就是使用Etag,与Last-Modified非常相近,它不是用文件的修改时间进行对比的,而是根据文件的内容进行生成一个标志串,一般都是使用文件的内容的md5值。比如,apache为一个静态的文件响应头上面加入了Etag的标志。下一次浏览器进行请求的时候,HTTP请求就会附加一个If-None-Match的标记,来询问文件是否被修改过,这时候服务器重新计算这个文件的Etag的值,如果相同的话,则直接允许浏览器使用本地缓存。不同的话,则直接返回最新的内容给浏览器。
两种的对比
有些特定的场合下,一些静态的文件,可能会被频繁的更新, 但是文件内容没有变化,这时候如果使用Last-modified,服务器端始终返回最新的内容给浏览器,而Etag是根据文件内容来的,如果内容没有变化的话,始终会让浏览器使用本地缓存的文件。所以,使使用ETag可以更好的避免一些不必要的服务器相应。