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

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

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

【问题讨论】:

    标签: http http-headers


    【解决方案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();
    })
    

    你可以观察到:

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

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

    【讨论】:

    • 非常感谢!你的回答太棒了!
    • @Squirtle.F 你的问题回答正确了吗?如果是,也许你可以“接受”这个答案?
    猜你喜欢
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 2021-11-10
    • 2017-07-27
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多