2017-04-15 47 views
1

我知道,如果我有一个响应包含一个头Cache-Control:max-age=100,这意味着高速缓存的新鲜生命周期为100秒相比。这是否意味着在100秒内,后续请求永远不会向服务器请求?所有这些请求都只是在缓存中收到响应?如何缓存控制效果请求头,在响应头

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

回答

0

这是否在百秒意味着,后续请求绝不会要求到服务器?所有这些请求都只是在缓存中收到响应?

除非随后的请求使用Cache-Control头来控制缓存,否则这些请求只会从缓存中获取响应数据。

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

是的,它会发送HTTP请求到原始服务器。请求头中的Cache-Control:no-cache表示:“除非资源被重新验证,否则浏览器不会从缓存中接受它”。 Cache-Control:max-age=<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个请求从缓存中获取资源,然后将请求发送到原点再次服务器...
  2. /poll要求有“的Cache-Control”为no-cachemax-age=0头,浏览器总是会发送请求到原始服务器。

请注意,在Chrome上执行此实验时,您需要在DevTool中取消选中Disable cache

+0

非常感谢!你的回答非常棒! –

+0

@ Squirtle.F是你的问题正确回答?如果是的话,也许你可以“接受”这个答案? – shaochuancs