HTTP Cache-Control header max-age 与 max-age、must-revalidate

HTTP Cache-Control header max-age vs max-age, must-revalidate

我想找出单独 max-age 和 max-age 与 Cache-Control must-revalidate 之间的区别 header。

我用这两个验证了 chrome。

  1. max-age=10 - 这意味着响应在 10 秒后不再有效,客户端必须到达服务器以获取新结果并且不应提供缓存的响应或10 秒后清除响应。

  2. max-age=10, must-revalidate - 这里 must-revalidate 定义了同样的东西,但是服务器可以有 304 响应,浏览器可以使用缓存数据即使在 10 秒后。

假设,与场景 1 不同,浏览器必须清除缓存并且应该期待来自服务器的新响应,而在场景 2 中浏览器可以保留缓存响应并期待 304 状态或新响应。

但是,实际上在 chrome 上面的陈述是不正确的,即使我们用 403 响应 chrome 仍然服务于来自缓存的响应,这意味着没有区别。 下面是 rest api.

的代码示例
var ccpublicWrongResp =  3;
var ccpublicWrongRespCount  = 0;
app.get('/ccpublic', function (req, res) {
  console.log(req.url + " - " + new Date().getSeconds());
  ccpublicWrongRespCount++;
   if(ccpublicWrongRespCount >= ccpublicWrongResp){
    console.log("Sending 304");
    res.statusCode = (304);
    res.send();
  }else{
    res.set('Cache-Control', 'public, max-age=12');
    res.send("Please check after 12 seconds ");
  }  
});

var j = 1;
app.get('/mustrevalidate', function (req, res) {
  console.log(req.url + " - " + new Date().getSeconds());
  j++;
  ccpublicWrongRespCount++;
  if(ccpublicWrongRespCount >= ccpublicWrongResp){
    console.log("Sending 304");
    res.statusCode = (304);
    res.send();
  }else{
    res.set('Cache-Control', 'public, max-age=12, must-revalidate');
    res.send(j + " with must-revalidate");
  }
});

首先要了解的是,缓存将尽可能尝试重新验证陈旧的资源(而不是获得完整的响应)。这就是为什么您在两个测试中看到相同的行为。

接下来,了解缓存在某些情况下是允许serve stale responses的;特别是,如果他们无法连接到原始服务器。

现在我们可以看到 must-revalidate 的目的了。这只是意味着缓存永远不应该提供过时的响应。

The must-revalidate response directive indicates that once it has become stale, a cache MUST NOT use the response to satisfy subsequent requests without successful validation on the origin server.

换句话说,您将指令解释为“必须重新验证而不是获得完整响应”,但它实际上意味着“必须重新验证而不是提供陈旧的内容,即使在缓存本来可以的情况下也是如此这样做。"

注意大多数情况下这个header的用法是inappropriate:

The must-revalidate directive ought to be used by servers if and only if failure to validate a request on the representation could result in incorrect operation.