一、no-cache 与 max-age
在 HTTP 1.0 中,服务器可以用头部信息的 Pragma: no-cache 字段指示浏览器不缓存该页面,或者用 Expires: Mon, 10 Jun 2013 01:50:58 GMT 指示浏览器在某时间后删除该页面的缓存。用非法的时间例如 Expires: -1 同样可以让浏览器不缓存该页面。
而在 HTTP 1.1 中,我们可以用 Cache-Control 字段进行更仔细的缓存控制。例如前面两个字段在 HTTP 1.1 可以分别类似 Cache-Control: no-cache 和 Cache-Control: max-age=3600 的方法来设置。
二、Last-Modified 与 If-Modified-Since
HTTP 1.0 中可以用 Last-Modified 和 If-Modified-Since 这一对字段来控制页面缓存。服务器在回应的 HTTP 头部中设置 Last-Modified 字段,例如:
Last-Modified:Mon, 27 May 2013 15:39:18 GMT
这样,浏览器下次访问同一页面时,在头部设置 If-Modified-Since 字段:
If-Modified-Since:Mon, 27 May 2013 15:39:18 GMT
服务器发现该页面在此时间后并没有修改,就可以返回 304 Not Modified 状态码,而不再重新发送页面内容。此时浏览器从缓存中读取页面内容。
三、ETag 与 If-None-Match
HTTP 1.1 中增加了 ETag 和 If-None-Match 这一对字段来控制页面缓存。服务器在回应的 HTTP 头部中设置页面的 ETag 字段(Etag 经常通过某种 hash 方式计算),例如:
ETag:"1368-1369669158000"
这样,浏览器下次访问同一页面时,在头部设置 If-None-Match 字段:
If-None-Match:"1368-1369669158000"
服务器发现该页面的 ETag 值并没有变化,就可以返回 304 Not Modified 状态码,而不再重新发送页面内容。此时浏览器从缓存中读取页面内容。
四、IE 的 Ajax 缓存问题
对于 Ajax 的 GET请求,IE 默认会缓存它,我们需要设置 Expires: -1 来阻止它的缓存。
参考资料:
[1] Hypertext Transfer Protocol -- HTTP/1.0
[2] Hypertext Transfer Protocol -- HTTP/1.1
[3] Key Differences between HTTP/1.0 and HTTP/1.1
[4] List of HTTP header fields - Wikipedia
[5] HTTP ETag - Wikipedia
[6] Internet Explorer’s Ajax Caching: What Are YOU Going To Do About It?
[7] Fixing Internet Explorer & AJAX | F5 DevCentral
[8] HOWTO:防止在 Internet Explorer 中进行缓存