Http Status 304响应状态的资源更新机制

最近做ITPService无意中查看了整个网站申请网络数据的信息,发现返回值都是304,而不是200,考虑到平时没有清理浏览器缓存的时候加载速度远快于第一次打开网站,猜测是为了提升加载速度。于是查阅了以下文章。


http请求头和响应头可以避免重复的资源(css,js,图片,文本等),浏览器一般访问这些静态资源之后会缓存一段时间,静态资源一般是不会经常改变的,而且这些资源比较大,比较多的情况会影响加载效果,所以要避免多次从网络加载这些文件。

一个完整的请求(本文作于2014-11-12,但资源时间是2014-10-30)

GET /assets/github-208780c72d87b50a0c3b932094adabe0ed787e29f3a60ddf60b7a8c0b66aeaff.css HTTP/1.1
Host: assets-cdn.github.com
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/css,*/*;q=0.1
If-Modified-Since: Thu, 30 Oct 2014 22:36:24 GMT
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36
Referer: https://github.com/
Accept-Encoding: gzip,deflate
Accept-Language: en-US,en;q=0.8
Cookie: logged_in=no; _octo=GH1.1.1132014134.1407914921; _ga=GA1.2.249759956.1407914919


服务器响应

HTTP/1.1 304 Not Modified
Date: Sun, 02 Nov 2014 01:59:39 GMT
Server: Apache
Via: 1.1 varnish
Last-Modified: Thu, 30 Oct 2014 22:36:24 GMT
Cache-Control: max-age=31536000, public
Expires: Sat, 31 Oct 2015 20:46:08 GMT
Age: 105210

浏览器资源访问过程:

1.当访问静态资源文件时,首先使用url hashcode作为key查询本地资源缓存。

2.如果没找到资源,那么直接访问浏览器,然后将请求的资源文件缓存并载入到html中。

3.如果找到资源,读该资源在服务器创建的的时间,加入http响应头If-Modified-Since: Thu, 30 Oct 2014 22:36:24 GMT,并发送到服务器。

4.服务器根据url进行查找资源,如果未找到,返回404。否则读取资源创建时间,给出响应状态吗。

5.浏览器如果收到404,会清空hascode对应的缓存,资源无法加载到html

6.浏览器如果收到 304,检查Last-Modified:Thu, 30 Oct 2014 22:36:24 GMT,如果(Last-Modified=If-Modified-Since),表示文件未被修改,则直接使用本地缓存加载到html.

7.比较之后,如果服务器>浏览器,则重新请求资源。

8.如果是200,则进行本地缓存更新  Last-Modified>If-Modified-Since,并加载到html。

这个过程看似复杂,但提高了资源的访问效率


额外浅谈一下验证码问题。

验证码刷新问题也是这个原理,一般来说验证码生成之后会缓存到服务上,他的创建时间和浏览器读取到的创建时间进行比较后,往往不在请求服务器。

验证码更新问题的结局,因为无法设置If-Modified-Since,但可以修改url,当url不行同时hashcode是找不到资源的,他会再次请求的,比如我们使用js,可以这样改变验证码的url,

var url=http://hostname:[port]/xxx/checkcode.php?rnd=Math.random();
img.src=url 。


原文地址:https://my.oschina.net/ososchina/blog/339896
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值