数据传输
,节省了网费。性能
速度
最后修改时间
If-Modified-Since
:当资源过期时(使用Cache-Control标识的max-age),发现资源具有Last-Modified声明,则再次向服务器请求时带上头If-Modified-Since。响应最新的资源
内容并返回200状态码;未更新
,告知浏览器继续使用所保存的缓存文件。var matchHandle = function(filename,req,res){
//最后修改时间
var ifModifiedSince = new Date(req.headers['if-modified-since']);
fs.stat(filename,function(err,stat){
////上次修改时间, 只发header
if(ifModifiedSince == stat.mtime.toUTCString()){
res.statusCode = 304;
res.end('');
}else{//如果时间不等则返回最新内容和最后修改时间
res.setHeader('Last-Modified',stat.mtime.toGMTString());
res.writeHead(200,'OK');
fs.createReadStream(filename).pipe(res);
}
});
}
最后修改时间
, 这样就无法通过最后修改时间来判断文件是否更新了。精确到秒
。内容并未改变
。 我们不希望客户端认为这个文件修改了。CDN
服务器上的时候内容虽然一样,修改时间不一样。ETag是实体标签的缩写,根据实体内容生成的一段hash
字符串,可以标识资源的状态。当资源发生改变时,ETag也随之发生变化。
ETag是Web服务端产生的,然后发给浏览器客户端。
var eTagHandle = function(filename,req,res){
fs.readFile(filename,function(err,content){
var hash = getHash(content);
var noneMatch = req.headers['if-none-match'];
if(hash == noneMatch){
res.writeHead(304,'Not Modified');
res.end();
}else{
res.setHeader('ETag',hash);
res.writeHead(200,'OK');
res.end(content);
}
})
}
浏览器会将文件缓存到Cache目录,第二次请求时浏览器会先检查Cache目录下是否含有该文件,如果有,并且还没到Expires设置的时间,即文件还没有过期,那么此时浏览器将直接从Cache目录中读取文件,而不再发送请求
var expireHandler = function(filename,req,res){
fs.readFile(filename,function(err,content){
//设置缓存时间为10秒
var expires = new Date(new Date().getTime()+6000*1000);
//缓存过期的时间(绝对时间)
res.setHeader('Expires',expires.toUTCString());
//多长时间后过期(单位是秒),过期前不发请求 60秒之后缓存过期(相对时间)
res.setHeader('Cache-Control','max-age=60');
res.writeHead(200,'OK');
res.end(content);
})
}