什么因素决定浏览器前进后退时的页面一定会被刷新?

排除ajax在外,常规的页面在前进后退后,有些页面是无缓存必须被刷新的,而有些则还停留在必须手动刷新的阶段。

这跟返回里面的 Response Headers 中的 Cache-Control 有关

比如用chrome浏览器第一次请求http://baidu.com,请求会直接发至baidu服务器,返回头信息内有

Cache-Control: max-age=0

如果你再看看baidu首页的html源代码,发现里面也没有任何做缓存控制的meta头,所以可以确定百度首页是被定义成不使用浏览器缓存的。

如果你将光标移入浏览器地址栏,按下回车,chrome会再发一次请求到服务器(因为不用缓存的缘故)。

但是,假如你点击首页的“贴吧”链接“,页面加载完成后,按浏览器的”back“键,在chrome的developer bar里面看到这次的请求是

(from cache)

所以尽管百度首页被定义成不使用缓存,但前进后退按钮仍然在使用缓存,确定这是chrome浏览器做出的决定。

多数浏览器应该都是这么设计成优先从缓存取的,但是否浏览器之间有差异,就需要自己配合firebug这样的工具去进一步确认了。


缓存大体上可分为两类:一类是由 Expires 控制的缓存,另一类是由 Last-Modified 和(或) ETag 控制的缓存。

对于前者,服务器会在请求头中包含有 Expires 头,其中指定了缓存的有效期。在这段有效期内,我们再次访问这个资源的时候,浏览器甚至连请求都不会发送(整个响应直接从缓存中去取),除非我们强制刷新页面。

对于后者,Last-Modified 其实是该资源的最后修改时间,服务器把这个最后修改时间告诉我们的浏览器之后,我们的浏览器在下次请求这个资源时会带上一个 If-Modified-Since 头,服务端会根据这个请求头来判断我们浏览器中对于这个资源的缓存是否已经过期,如果没有过期,则返回 304 Not Modified 状态(之后不会附加资源的内容),浏览器就从缓存中取;如果已经过期了,则返回 200 OK 状态(附带更新的资源内容)。ETag 机制也是类似的,唯一不同的是,ETag 是个 token,资源内容被改变之后,ETag 也会发生改变。

一般来说,前进、后退时主流浏览器都会从缓存中取内容。但是有一种情况比较特殊,就是请求类型为 POST 时,浏览器会提示你内容已过期,此时必须刷新重新提交数据。

你可能感兴趣的:(什么因素决定浏览器前进后退时的页面一定会被刷新?)