Varnish 4不支持Cache-Control:必须重新验证

时间:2016-01-22 03:53:33

标签: varnish varnish-vcl

我正在尝试使用最后修改的标题使Varnish工作,但无论我做什么,我的页面都会在120秒内缓存,而Varnish永远不会在后端重新验证。

我的后端正在发送这些标题:

Cache-Control: must-revalidate, proxy-revalidate, public, stale-while-revalidate=0
Last-Modified: Fri, 22 Jan 2016 03:32:33 GMT

当我在命中时记录对象的TTL时,它的值总是设置为120秒。

我正在使用 Varnish 4的默认VCL 配置。

此致

编辑:经过一些搜索,我发现120s是Varnish的默认ttl值。但他为什么忽视最后修改过的?

2 个答案:

答案 0 :(得分:1)

设置" s-maxage"或" max-age" Cache-Control标头的属性:

  

beresp.ttl使用它找到的第一个值进行初始化:

The s-maxage variable in the Cache-Control response header field
The max-age variable in the Cache-Control response header field
The Expires response header field
The default_ttl parameter.

请参阅:http://book.varnish-software.com/4.0/chapters/VCL_Built_in_Subroutines.html#the-initial-value-of-beresp-ttl

答案 1 :(得分:1)

我从Varnish邮件列表中得到了答案,以便模仿"必须重新验证"标题,必须添加这块VCL:

sub vcl_backend_response {
    if (beresp.http.cache-control ~ "must-revalidate") {
        set beresp.ttl = 1s;
        set beresp.grace = 0s;
        set beresp.keep = 1w;
    }
}

它仅适用于Varnish 4。

我引用了1s ttl的原因:

  

这样,您只需缓存1秒钟(不要将其设为0,或全部   对这个对象的请求将按顺序完成,但会保留   一个星期的对象,每次请求时重新验证它   它的ttl已过期。