浏览器的F5和Ctrl+F5

摘要:
在浏览器中,按F5和按F5同时按Ctrl会产生不同的效果。两者之间有什么区别?事实上,为了确保从服务器获取最新信息,Ctrl+F5不仅删除了If Modified Since/If None Match,还添加了一些HTTP标头。在IE6中,Ctrl+F5将添加HeaderPragma:无缓存。在Firefox 2.0中,Ctrl+F5将添加两个Pragma:no-cacheCache Control:max-age=0,用于使该请求的中间缓存无效。通过这种方式,返回的资源是绝对新鲜的Cache Controlmax age=0Cache Controlno Cache-强制将每个请求直接发送到源服务器,而无需验证本地缓存版本。

在浏览器里中,按F5键和按F5同时按住Ctrl键(简称Ctrl+F5),效果是不同,到底两者有什么区别呢?

假如我第一次访问过http://localhost/home,这个网页是个动态网页,每次访问都会去访问Server,但是它包含一个一个静态资源http://localhost/content/bootstrap.css,浏览器在显示这个网页之前需要发HTTP请求获取这个bootstrap.css文件,返回的HTTP response包含这样的Headers:

浏览器的F5和Ctrl+F5第1张

下次我再通过bookmark或者通过在URI输入栏直接敲字的方法访问http://localhost/home的时候,浏览器一看本地有个bootstrap.css,而且它还没过期呢,就不会发HTTP request给server,而是直接把本地cache中的bootstrap.css显示了。

F5的作用和直接在URI输入栏中输入然后回车是不一样的,F5会让浏览器无论如何都发一个HTTP Request给Server,即使先前的Response中有Expires Header。所以,当我在当前http://localhost/home网页中按F5的时候,浏览器会发送一个HTTP Request给Server,但是包含这样的Headers:

If-Modified-Since: Wed, 20 Jan 2016 10:24:40 GMT

实际上Server没有修改这个bootstrap.css文件,所以返回一个304 (Not Modified),这样的Response很小,所以round-trip耗时不多,网页很快就刷新了。

浏览器的F5和Ctrl+F5第2张

上面的例子中没有考虑ETag,如同在上一篇技术文章中所说,最好就不要用ETag,但是如果Response中包含ETag,F5引发的Http Request中也是会包含If-None-Match的。

那么Ctrl+F5呢? Ctrl+F5要的是彻底的从Server拿一份新的资源过来,所以不光要发送HTTP request给Server,而且这个请求里面连If-Modified-Since/If-None-Match都没有,这样就逼着Server不能返回304,而是把整个资源原原本本地返回一份。

浏览器的F5和Ctrl+F5第3张

实际上,为了保证拿到的是从Server上最新的,Ctrl+F5不只是去掉了If-Modified-Since/If-None-Match,还需要添加一些HTTP Headers。按照HTTP/1.1协议,Cache不光只是存在Browser终端,从Browser到Server之间的中间节点(比如Proxy)也可能扮演Cache的作用,为了防止获得的只是这些中间节点的Cache,需要告诉他们,别用自己的Cache敷衍我,往Upstream的节点要一个最新的copy吧。

在IE6中,Ctrl+F5会添加一个Header

Pragma: no-cache


在Firefox 2.0中,Ctrl+F5会添加两个 
Pragma: no-cache 
Cache-Control: max-age=0

作用就是让中间的Cache对这个请求失效,这样返回的绝对是新鲜的资源

浏览器的F5和Ctrl+F5第4张

Cache-Control max-age=0

 
Cache-Control  no-cache — 强制每次请求直接发送给源服务器,而不经过本地缓存版本的校验。这对于需要确认认证应用很有用(可以和public结合使用),或者严格要求使用最新数据 的应用(不惜牺牲使用缓存的所有好处) 
Pragma 当"no-cache"出现在请求消息中时,应用程序应当向原始服务器推送此请求,即使它已 
经在上次请求时已经缓存了一份拷贝。这样将保证客户端能接收到最权威的回应。它也用来 
在客户端发现其缓存中拷贝不可用或过期时,对拷贝进行强制刷新。 
cache-control 
max-age>0 时 直接从游览器缓存中 提取 
max-age<=0 时 向server 发送http 请求确认 ,该资源是否有修改 
有的话 返回200 ,无的话 返回304. 

免责声明:文章转载自《浏览器的F5和Ctrl+F5》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇thymeleaf参考手册Spring MVC重定向和转发及异常处理下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【巷子】---json-server---基本使用

一、前后端并行开发的痛点 前端需要等待后端开发完接口以后 再根据接口来完成前端的业务逻辑 二、解决方法 在本地模拟后端接口用来测试前端效果 这种做法称之为构建前端Mock 三、json-server的基本使用 (1)、全局安装 cnpm install json-server -g (2)、准备json文件 (data.json) json-serv...

Spring异常集中处理和日志集中打印

使用@ControllerAdvice和@ExceptionHandler处理Controller层的异常: @ControllerAdvice public class GlobalExceptionHandler { private static final Logger LOGGER = LoggerFactory.getLogger(Gl...

动态将ASPX生成HTML网页并将网页导出PDF

1.首先要找到wnvhtmlconvert.dll这个文件,并引入项目中。 2.Server.Execute("pos.aspx?id=" + ids); 执行相应的aspx网页 3.pos.aspx网页中有这样的一个方法,此方法用来生成html页面 protected override void Render(HtmlTextWriter writer)...

.NET ActionFilterAttribute等

public override void OnException(HttpActionExecutedContext actionExecutedContext){//加LOG actionExecutedContext.Exception //2.返回调用方具体的异常信息if (actionExecutedContext.Exception is Not...

Java Web----------response&amp;amp;&amp;amp;request

1.response 代表响应, 可以理解为一个空的箱子,我们在里面填入要发送到浏览器的内容. 服务器会把这些内容组装成http响应. 1.1 响应首行 协议/版本号 状态码 状态码描述 添加状态码 和 描述 void setStatus(int sc) 只设置状态码 void setStatus(int sc, String sm)...

将文件以流的形式另存为下载

//【1】附件为本地磁盘路径(附件可以为图片、pdf、word等等)string strFile = Server.MapPath("/images/526763.pdf"); using (FileStream fs = new FileStream(strFile, FileMode.Open)) { byte[] bytes = new b...