浏览器按F5与地址栏访问的区别

以下是本人对这些现象的个人理解,不正确的还请指正。

首先来看一下表面现象:

        用来测试的浏览器为IE浏览器,首先将浏览器的缓存全部清空。

第一次访问目标地址,我们的开发者工具中网络面板显示情况如下:

    浏览器按F5与地址栏访问的区别

相应的请求头和响应头分别为:

1.Request头部,IE浏览器没有控制缓存的信息

   浏览器按F5与地址栏访问的区别

2.Response的头部信息:

浏览器按F5与地址栏访问的区别

可以看到,响应表头添加了ETag和Last-Modified信息。ETag和Last-Modified的意义将在下文讲到。

此时我们分别通过按F5刷新按和在地址栏里重新输入地址观察现象。

按F5刷新按钮:

    浏览器按F5与地址栏访问的区别

我们得到一个304的状态码,意思是服务器资源并没有修改,b.html将从缓存加载。对这次请求的request和response进行分析。

        request请求:

            浏览器按F5与地址栏访问的区别        

        可以看到,这次的请求头部有一个if-Modified-Since和if-None-Match信息。它们的含义大致为:在第一次访问的过程中,我们看到响应里有ETag和Last-Modified两个key的信息。Last-Modified根据字面理解就是该资源上次修改的日期。ETag可以简单理解为资源的一个标识符,在资源的各个生命周期中,它都具有不。当资源发生变更时,如果其头信息中一个或者多个发生变化,或者消息实体发生变化,那ETag也随之发生化。第二次请求的if-Modified-Since和if-None-Match作用便是与服务器上存储的ETag和Last-Modified进行对比,如若if-Modified-Since与Last-Modified相等并且ETag和if-None-Match相等,则服务器返回304状态码,表示资源并没有刷新。若不相等,则重新从服务器进行资源的获取。

明白了以上的原理,我们分析上面的请求头,可以看到该对比是相等的,所以系统的Response便是304状态码,我们可以看一下这个Response。

Response:

    浏览器按F5与地址栏访问的区别浏览器按F5与地址栏访问的区别

分析了按F5出现304状态码的原因,我们再来看一下在地址栏输入出现的结果

地址栏输入地址按回车:

浏览器按F5与地址栏访问的区别

    可以看到,结果为200状态码,结果来自缓存,意思就是浏览器并没有发送请求。

我们看到的请求的标头也是空的,那么地址栏输入地址按回车意思就是直接从缓存进行加载,而不去进行缓存内容的更新验证。但是问题来了,我们都知道缓存是有一个过期时间的,如果缓存没有过期可以看到以上结果,如果缓存过期怎么办呢,我们继续分析。

现在我们用charles工具进行分析,该工具可以拦截Http的请求响应并进行相应的想改再发送。

我们首先在Charles打好断点,清楚缓存,访问该html页面。

此时,我们的该html的响应中,给它添加一个过期时间,Cache-Control:max-age=30。意思是该缓存可以存活30s,具体的Cache-Control细节我正在研究,并在将来写相应的原理讲解的文章。

浏览器按F5与地址栏访问的区别

这时,将这个请求,返回给浏览器。等待30s,我们再次通过地址栏输入地址按回车键,可以看到此次请求并没有像之前那样直接从缓存加载数据,而是向服务器发送了请求,进行了缓存的验证工作。

浏览器按F5与地址栏访问的区别

此处需要明确的是,当浏览发现缓存文件过期后,并不会直接从服务器下载资源,而是首先进行资源的版本检测,如果发现服务器资源没有发生变化,便会如上图所示服务器返回304状态码,这样相对于直接从服务器下载会节省很多流量。