与Response标头相比,Cache-Control如何在Request标头中生效

时间:2017-04-15 09:43:59

标签: http http-headers

我知道如果我收到包含标题Cache-Control:max-age=100的响应,则表示缓存的新鲜度生命周期为100秒。这是否意味着在100秒内,后续请求永远不会请求服务器?所有这些请求只是在缓存中收到响应吗?

因此我有一个问题,如果后续请求包含标题Cache-Control:no-cacheCache-Control:max-age=0,它是否会在100秒内向原始服务器请求,即使缓存不是陈旧的?

1 个答案:

答案 0 :(得分:0)

这是否意味着在100秒内,后续请求永远不会向服务器请求?所有这些请求只是在缓存中收到响应吗?

除非后续请求使用Cache-Control标头对缓存进行更多控制,否则请求只会从缓存中获取响应数据。

如果后续请求包含标头Cache-Control:no-cacheCache-Control:max-age=0,即使缓存未过时,它是否会在100秒内向原始服务器请求?

是的,它会向原始服务器发送HTTP请求。请求标头中的Cache-Control:no-cache表示:“除非资源被重新验证,否则浏览器不会从缓存中接受它”。请求标头中的Cache-Control:max-age=<n>表示:“浏览器不会接受超过 n 秒的任何缓存” - 当 n 为0时,浏览器将始终向服务器

这是一个简单的实验。

在浏览器中:

var poll = function() {
  $.ajax({
    url: '/poll',
    beforeSend: function(xhr) {
      //xhr.setRequestHeader('Cache-Control', 'no-cache');
      //xhr.setRequestHeader('Cache-Control', 'max-age=0');
    },
    success: function(){
      setTimeout(poll, 5000);
    }
  });
}
poll();

在服务器中:

http.createServer(function(req,res) {
  ...
  // if request path is /poll
  res.setHeader('Cache-Control', 'max-age=18');
  res.end();
})

你可以观察到:

  1. /poll请求不包含Cache-Control标头时,浏览器会向源服务器发送请求,从缓存中获取下3个请求的资源,然后再次向源服务器发送请求... < / LI>
  2. /poll请求将“缓存控制”标头设为no-cachemax-age=0时,浏览器将始终向源服务器发送请求。
  3. 请注意,在Chrome上执行此实验时,您需要取消选中DevTool中的Disable cache