在我们浏览一个页面发现异常情况时,通常考虑的是不是浏览器做了缓存,所以一般的做法就是按Ctrl+F5组合键来重新请求一次,这样重新请求的页面就是最新的页面。
为什么?首先,在浏览器端,如果按Ctrl+F5来刷新页面,那么浏览器会直接向目标的URL发送请求,而不是去使用浏览器的缓存数据。其次,即使请求发送到服务器,也有可能访问到的时缓存的数据(比如:在应用服务器的前端部署一个缓存服务器,像Varnish代理,那么Varnish也可能直接使用缓存的数据)。所以,为了保证用户看到最新的数据,必须通过HTTP来控制。
当我们使用Ctrl+F5来刷新一个页面时,在Http的请求头中会增加一些请求头,从而让服务器知道我们需要获取的时最新的数据,而不是缓存的数据。
增加的请求头到底是什么呢?
Pragma:no-cache
Cache-Control:no-cache
为什么增加这两个请求头信息之后,页面就会获取最新的数据?这两个配置项有什么作用呢?
Pragma/Cache-Control:用于指定所有的缓存机制在整个请求/响应链中必须服从的指令,如果知道了该页面是否是缓存的,不但可以控制浏览器,还可以控制和HTTP相关的缓存或代理服务器。
配置项的可选值:
Public:所有内容都将被缓存,在响应头中设置;
Private:内容只缓存到私有的缓存中,在响应头中设置;
no-cache:所有内容都不会被缓存,在请求头和响应头中设置;
no-store:所有内容都不会被缓存到缓存或者Internet的临时文件中,在响应头中设置;
must-revalidation/proxy-revalidation:如果缓存的内容失效,请求必须发送到服务器/代理中以进行重新的验证,在请求头中设置;
max-age=xxx:缓存的内容将在xxx秒后失效,这个选项只在HTTP1.1中可用,和Last-modified一起使用时,优先级较高,在响应头中设置。
Pragma:no-cache和Cache-Control:no-cache的作用时一样的。
需要注意的是,Cache-Control优先级比较高,在和其他的一些请求字段(如Expires)同时出现时,Cache-Control会覆盖其他字段。