与响应标头相比,请求标头中的 Cache-Control 效果如何

Posted

技术标签:

【中文标题】与响应标头相比,请求标头中的 Cache-Control 效果如何【英文标题】:How does Cache-Control effect in Request header, compared with in Response header 【发布时间】:2017-09-11 11:34:49 【问题描述】:

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

所以我有一个问题,如果后续的请求包含了一个headerCache-Control:no-cache或者Cache-Control:max-age=0,即使缓存没有过期,它会在100秒内向原服务器请求吗?

【问题讨论】:

【参考方案1】:

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

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

如果后续请求中包含了headerCache-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();
)

你可以观察到:

    /poll请求不包含Cache-Control头时,浏览器会向源服务器发送请求,为接下来的3个请求从缓存中获取资源,然后再次向源服务器发送请求... 当/poll 请求的“Cache-Control”标头为no-cachemax-age=0 时,浏览器将始终向源服务器发送请求。

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

【讨论】:

非常感谢!你的回答太棒了! @Squirtle.F 你的问题回答正确了吗?如果是,也许你可以“接受”这个答案?

以上是关于与响应标头相比,请求标头中的 Cache-Control 效果如何的主要内容,如果未能解决你的问题,请参考以下文章

如何在WPF应用程序中的SOAP客户端的“Set-Cookie”标头响应的新请求中设置“Cookie”标头

在响应中的每个获取请求之前附加自定义标头

Javascript图像 - 响应中的访问标头

Angular 2:无法访问 http 请求中的响应标头

允许跨域 ajax 请求中的标头

如何为一元 rpc 定义响应标头