记一些浏览器缓存以前不太熟悉的东西

浏览器缓存,以前看过不少这方面的资料,一直觉得是运维应该处理的事情,自己重未动手操作过,所以理解不深,也容易忘记.

最近看了一下nodejs做静态服务器,稍微有了点深入的理解,于是做下笔记

看的一些文章

cache-control,Expires,Last-Modified

缓存的过程

nodejs的简单实现

看的一些文章

https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching?hl=zh-cn

http://www.laruence.com/2010/03/05/1332.html

http://www.alloyteam.com/2012/03/web-cache-2-browser-cache/

http://blog.csdn.net/eroswang/article/details/8302191

https://cnodejs.org/topic/4f16442ccae1f4aa27001071

cache-control,Expires,If-Modified-Since,last-modified

一些常用的在请求头,响应头里面设置缓存的东西

Expires

Expires 头部字段提供一个日期和时间,响应在该日期和时间后被认为失效。失效的缓存条目通常不会被缓存

Expires 字段接收以下格式的值:“Expires: Sun, 08 Nov 2009 03:37:26 GMT” 比如我要设置30天的时间, nodejs里面就是这样的new Date(new Date().getTime()+60*60*24*30).toUTCString()

这个要和Last-Modified配合使用

当请求过的文件,就被缓存在浏览器里面,下次请求的时候,如果是直接在浏览器里面输入地址,是不会发请求的

如果强制ctrl+R 则会发请求,服务端根据请求头的Last-Modified和请求文件的修改时间对比,如果没有修改返回304,不会像客户端返回文件,节省带宽,客户端发现返回的是304,就从浏览器读取文件

从http/1.0就开始支持了

如果有cache-control max-age 会覆盖Expires

cache-control

这个有很多值可以设置,我能理解只有4个no-cache,max-age,public,private

no-cache

这个很好理解了,就是不缓存

max-age

设置的是一个秒数,在这个时间内不会像服务器发请求,如果强制刷新,返回304,跟Expires一样

格式如下Cache-Control:max-age=315360000

public

响应会被缓存,并且在多用户间共享

private

响应只能够作为私有的缓存,不能再用户间共享。比如POST表单提交时,会帮你保留已经填写的内容,指明每个用户一个缓存

Last-Modified

Last-Modified存放的是文件最后一次修改的时间

格式如下last-modified:Thu, 23 Jul 2015 08:50:29 GMT

这个是设置在响应头里面

if-modified-since

浏览器端接收到服务器端的Last-Modified,记录下来,下次在发送请求的时候,请求头里面带上if-modified-since,它的值就是之前Last-Modified返回的值

缓存的过程

只是个人的一些理解,也不一定都对,静态服务器端用nodejs处理

1.当浏览器第一次访问的时候,所有的文件都要进行下载

2.当服务端收到请求的时候,如果请求的是静态资源(暂时把图片,样式,js规定为静态资源),返回头里面写入Last-Modified,Expires,Cache-Control,Last-Modified是告诉文件最后的修改时间,Expires和Cache-Control是告诉浏览器这些文件可以缓存在浏览器

3.浏览器再次访问该地址时候,如果是直接在浏览器输入,被缓存的文件请求是不会发出去的,如图

4.如果强制刷新(ctrl+r),这时请求就会发出去了,到了服务器端,就根据请求头传来的if-modified-since对比文件的last-modified,如果没有修改,不会返回文件内容,返回状态码304,如图

nodejs的简单实现

var http = require("http");
var fs   = require("fs");
var url  = require("url");
var querystring = require("querystring");

http.createServer(function(req,res){
    var gurl = req.url,
        pathname = url.parse(gurl).pathname;

    if( pathname.indexOf("favicon.ico")>=0){
        var ico = fs.readFileSync("./favicon.ico");
        res.writeHead(200,{
            "Content-Type" : "image/x-icon"
        })
        res.end(ico);
        return;
    }

    if(pathname.indexOf("/static/")==0){
        var realPath = __dirname + pathname;
        dealWithStatic(pathname,realPath,res,req);
        return;
    }
}).listen(5555);

function dealWithStatic(pathname,realPath,res,req){
    fs.exists(realPath,function(exists){
        if(!exists){
            res.writeHead(404,{
                "Content-Type" : "text/html"
            });
            res.end("not find!!!");
        }else{
            var mmieString = /\.([a-z]+$)/i.exec(pathname)[1],
                cacheTime  = 2*60*60,
                mmieType;
            switch(mmieString){
                case "html" :
                case "htm"  :
                case "xml"  : mmieType = "text/html";
                break;
                case "css"  : mmieType = "text/css";
                break;
                case "js"   : mmieType = "text/plain";
                break;
                case "png"  : mmiType  = "image/png";
                break;
                case "jpg"  : mmiType  = "image/jpeg";
                break;
                default     : mmieType = "text/plain";
            }

            var fileInfo      = fs.statSync(realPath),
                lastModied    = fileInfo.mtime.toUTCString(),
                modifiedSince = req.headers[‘if-modified-since‘]

            if(modifiedSince && lastModied == modifiedSince){
                res.writeHead(304,"Not Modified");
                res.end();
                return;
            }

            fs.readFile(realPath,function(err,file){
                if(err){
                    res.writeHead(500,{
                        "Content-Type" : "text/plain"
                    });
                    res.end(err);
                }else{
                    var d = new Date();
                    var expires = new Date(d.getTime()+10*60*1000);
                    res.writeHead(200,{
                        "Content-Type"  : mmieType,
                        "Expires"       : expires.toUTCString(),
                        "Cache-Control" : "max-age=" + cacheTime,
                        "Last-Modified" : lastModied
                    });
                    res.end(file);
                }
            });
        }
    });
}
时间: 2025-01-09 09:17:45

记一些浏览器缓存以前不太熟悉的东西的相关文章

浏览器缓存机制浅析

非HTTP协议定义的缓存机制 浏览器缓存机制,其实主要就是HTTP协议定义的缓存机制(如: Expires: Cache-control等).但是也有非HTTP协议定义的缓存机制,如使用HTML Meta 标签,Web开发者可以在HTML页面的<head>节点中加入<meta>标签,代码如下: <META HTTP-EQUIV="Pragma" CONTENT="no-cache"> 上述代码的作用是告诉浏览器当前页面不被缓存,每

手机浏览器缓存和电脑浏览器缓存的问题记录

一.背景描述: 为了优化web网页速度,我们采取了js,css合并压缩,并在服务端控制.所以我就学习了一下,浏览器缓存的原理. 因为我不想使用版本号控制,版本号具有诸多弊端: 1.每次修改都得修改版本号. 2.如果所有页面的引用,单独配置版本号,那么每次的修改量很大: 3.如果为了避免2的问题,针对所有页面使用同一个熟悉配置,那么每次修改一个文件并更新版本号之后,所有的引用的版本号都更新了,太傻了. 所以,不采取版本号控制,使用时间控制,页面引用不用变,目标文件发生了变化,服务器能告诉客户端浏览

host缓存,浏览器缓存---解决host缓存带来的伤

1.缓存 缓存,对应工程师来讲简直太熟悉了,太方便了,省略到资源或数据的获取方式,直接缓存到离用户访问最快的地方,也降低服务器的压力,比如: (1)静态文件获取 服务器->cdn->本地磁盘->本地内存 (2)数据获取 数据库->内存型数据库 (3)host 缓存 主域名服务器->顶级域名服务器->根域名服务器->网络服务提供商缓存->路由器缓存->系统缓存->浏览器缓存 缓存的好处不言而喻,提升用户的访问速度,降低服务端的压力,问题就是:多份数

浏览器缓存机制(1)

浏览器缓存机制之一(经典缓存) 因为在接手的项目中用到过比较新的HTML5应用缓存,也用到了经典的缓存如设置max-age,Etag之类,而之前一直就是在用着没有去深究其中原理.周末天气不好,懒得出去了,正好找时间总结下. 1.关于浏览器缓存 记得去年看<HTTP权威指南>的时候,有一章是专门讲浏览器缓存的,一年时间过得太快,逝去的时光还真是如同人群中消失的好姑娘,眼看她嫁给别人.我这里把浏览器缓存分为经典的浏览器缓存(以下简称为经典缓存)和HTML5应用缓存这两类. 经典的浏览器缓存其实主要

浅谈浏览器缓存-2016

前(fei)言(hua):新年第一篇文章, 这一博文代码准备许久奈何之前比较忙,春节后这几天有空总结下浏览器缓存. 浏览器缓存历史简介 浏览器缓存实现一开始各家浏览器厂商标配的都是Cookies, 随着前端显示越来越复杂,Cookies那可怜的几K容量明显不够用了:在2000年至2008年间,没有统一标准出现了很多浏览器缓存的插件实现如:Flash SharedObject ,Google Gears:HTML5标准的提出,出现了很多缓存的标准如:localstorage ,webSql ,In

浏览器缓存相关http头

最近看雅虎黄金34条,学习下优化网站性能的方法.其中有一条:"为文件头指定Expires或Cache-Control",具体来说指对于静态内容:设置文件头过期时间Expires的值为"Never expire"永不过期:而对于动态内容:使用恰当的Cache-Control文件头来帮助浏览器进行有条件的请求. 这一条可以和雅虎34条的第一条联系起来,那就是尽量减少http的请求次数(雅虎34条很多都是努力去减少http请求为目的的),毕竟如果有太多的资源需要下载需要新

分享一个控制JS 浏览器缓存的解决办法。

 JS 缓存的问题一直都是我们又爱又恨的东西.也是我们比较头痛的问题, 一方面为了提高网站响应速度,减少服务器的负担,和节省带宽,将需要将静态资源缓存在客户端, 但是另一方面,当js 文件有改动的时候,如何快速的将客户端缓存的js文件都失效,这是非常头痛的问题. 以至于每次客户反馈问题的时候,我们第一个解决办法都是清理浏览器缓存. 那么如何解决呢. 1. 直接禁止全部的静态文件缓存 在html 头部加上如下代码: <META HTTP-EQUIV="pragma" CONTENT

缓存系列之一:buffer、cache与浏览器缓存

一:缓存是为了调节速度不一致的两个或多个不同的物质的速度,在中间对速度较快的一方起到一个加速访问速度较慢的一方的作用,比如CPU的一级.二级缓存是保存了CPU最近经常访问的数据,内存是保存CPU经常访问硬盘的数据,而且硬盘也有大小不一的缓存,甚至是物理服务器的raid 卡有也缓存,都是为了起到加速CPU 访问硬盘数据的目的,因为CPU的速度太快了,CPU需要的数据硬盘往往不能在短时间内满足CPU的需求,因此PCU缓存.内存.Raid 卡以及硬盘缓存就在一定程度上满足了CPU的数据需求,即CPU

如何使用浏览器缓存来加快站点的访问速度 转载

当我们想尽办法提高服务器负载能力的时候,是否曾想过,其实浏览器也有缓存功能,我们也可以利用浏览器的缓存功能来减少服务器的负载,提高网站吞吐量?        当我们使用抓包工具查看http状态时,我们可以看到200,304,from cache之类的标识,也许你也早已注意到了他们,并明白他们的意思.但是,你是否想过在你的程序中加入代码主动告诉浏览器,更好地利用浏览器缓存. 备注:本章所有案例都是使用chrome 17.0.963.79 m浏览器,测试方式为每次打开浏览器新窗口的方式测试,而不是F