index.html为什么不会强制缓存?

新手上路,请多包涵
const http = require('http')
const url = require('url')
const fs = require('fs')

var getContentType = function(pathname) {
  switch(pathname) {
    case '/index.html' : {
      return 'text/html;charset=utf-8';
    }
    case '/photo.jpg' : {
      return 'img/jpg';
    }
  }
}
var server = http.createServer((req, res) => {
  // http://localhost:3000/index.html
  var pathname = url.parse(req.url).pathname;
  if(pathname == '/favicon.ico') {
    return
  }
  var realpath = 'static' + pathname;

  var MaxAge = 10;
  res.setHeader('Cache-Control' , 'max-age=' + MaxAge);

  var now = new Date();
  var date = (now.getTime() + MaxAge*1000);
  now.setTime(date);
  res.setHeader('Expires', now.toUTCString());

  fs.stat(realpath, function(err, stats) {
    var lastTime = stats.mtime.toUTCString();
    res.setHeader('last-Modified', lastTime);
    fs.readFile(realpath, function(errs, data) {
      if(errs) {
        res.writeHead(404, {'Content-Type':'text/html;charset=utf-8'});
        res.write('404');
        res.end();
      } else {
        if(req.headers['if-modified-since'] && req.headers['if-modified-since'] == lastTime) {
          res.writeHead(304, 'Not Modified');
          res.end();
        } else {
          res.writeHead(200, {'Content-Type':getContentType(pathname)});
          res.write(data);
          res.end();
        }
      }
    })
  })

  
})
server.listen(3000);

这是刷新前
图片.png
这是十秒内刷新后
图片.png

为什么index.html文件不是200 from memory cache呢???

阅读 3.1k
4 个回答

10s内不走服务器走缓存, 10s后走服务器,服务器告诉你304没变化好像也没有什么问题吧

cache-controlexpires同时存在的话,前者优先级高于后者,你这里cache-control10秒过期了,会向服务器进行请求,而不是走强缓存,服务器发现Last-Modifued等信息没变,也就是你没修改文件,就返回的304通知浏览器文件没变,可以直接从缓存获取,这是协商缓存,区别在于一个向服务器进行了询问(协商缓存),一个没有(强缓存)

你需要看看第二次请求的http报文,是否进行了f5刷新等操作,也就是请求头上是否设置了cache-control: max-age=0

新开一个窗口、或者当前窗口在地址栏敲下回车访问同样的地址再测试(手慢的你可以把过期时间设长点……)。

Chrome 的 F5 或者点菜单栏刷新不走强缓存。

有200 from cache 这个选项?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题