一起使用max-age和s-maxage

时间:2018-02-01 14:52:07

标签: symfony caching proxy

我有一个使用foshttpcachebundle进行缓存的symfony应用程序。

我使用cloudfare作为代理缓存,http cache用于反向代理缓存,我想为私有缓存(浏览器),共享缓存(cloudfare)和代理缓存(http symfony缓存)定义不同的时间。我遵循这个架构:

enter image description here

我的配置文件是:

fos_http_cache:
    cache_control:
        defaults:
            overwrite: false
               match:
                   attributes:
                       _route: "api_news_article_cget_version"
                headers:
                   reverse_proxy_ttl: 120
                   cache_control:
                       public: true
                       max_age: 30
                       s_maxage: 60
                   last_modified: "30 seconds"

因此,此配置会将此标头添加到响应

  

年龄:0
  缓存控制:max-age = 30,public,s-maxage = 60
  CF-RAY:3e6474b0b6590c17-AMS连接:保持活着
  内容编码:gzip
  内容类型:application / json
  日期:星期四,2018年2月1日11:08:58 GMT Last-Modified:星期四,2018年2月01日11:09:28 GMT
  服务器:CloudFlare的
  最后修改时间:2018年2月1日星期四,格林威治标准时间14:37:09

所以,我将解释我的想法:

  • 如果我是第一个提出请求的用户,我会得到一个带有新内容的200响应(这是正确的)。

  • 如果我更新原始服务器上的内容,然后我继续发出请求29秒,我的请求将不会被修改304(因为内容缓存在Cloudflare中)。 (这是对的)

  • 30秒后(最大年龄),我认为下一个响应应该是200响应。我想这是因为浏览器需要刷新缓存(max-age = 30秒),但响应将是相同的,因为代理缓存是60秒。这是不对的,浏览器以相同的方式继续发出请求并获得304代码(不修改)。

  • 60秒后(s-maxage),我应该得到代码响应为200的新响应。这是事实。但是,如果我不更新原始服务器中的内容,我也会得到200的状态代码。我不明白为什么,我认为我应该得到304响应。

现在我的问题是:

  • 为什么我的浏览器在30秒后没有得到新的响应?如果我在谷歌浏览器上禁用缓存,我会在每个请求中获得一个新的响应(状态代码= 200)。

  • 为什么只有在s_maxage结束时才刷新缓存?

  • 如何在浏览器和代理缓存中获取不同的缓存时间?

0 个答案:

没有答案