如何设置 Varnish 缓存控制标头

问题描述 投票:0回答:4

我希望有人可以建议让 Varnish 发送缓存控制标头的正确方法。目前,我的配置正在向客户端发送“Cache-Control:no-cache”

提前感谢任何能够提供帮助的人...

http-headers cache-control varnish varnish-vcl
4个回答
15
投票

你的后端正在向 Varnish 发送“Cache-Control: no-cache”,这意味着两件事:

  • Varnish 不会将响应存储在缓存中(因此下一次查找将失败)
  • 您的客户端(浏览器和中间代理)不会缓存响应(并一遍又一遍地请求它们)。

解决方案很简单:在从后端获取响应之后(以及将它们存储到缓存之前)删除缓存控制标头。

在你的 vcl 文件中执行:

sub vcl_fetch {
  remove beresp.http.Cache-Control;
  set beresp.http.Cache-Control = "public";
}

您可以选择仅对某些网址执行此操作(将其包装在

( if req.url ~ "" )
逻辑中)并执行更高级的操作。


4
投票

Varnish 根据文档忽略 Cache-Control: nocache。 以下证据证实了这一点:

http://drupal.org/node/1418908

要获得该结果,您应该从后端检测标头 Cache-Control .nocache.,然后使缓存无效,将后端响应设置为不可缓存,或在另一个标头中发出 max-age: 0 (我现在忘记名字了)。


1
投票

[ivy] 有很好的建议,和/但是当您尝试遵守服务器对最终用户(浏览器)缓存的意图时,它会变得有点复杂。我发现此资源有助于理解配置 Varnish 的方法,使其保留缓存的时间比浏览器指示的时间长......

https://www.varnish-cache.org/trac/wiki/VCLExampleLongerCaching


0
投票

2024 年这是正确的:

sub vcl_backend_response {
    if (beresp.status == 200) {
        set beresp.ttl = 5m; # Adjust as needed
    }
    set beresp.http.X-Varnish = bereq.xid;
    set beresp.http.Age = "0"; # Will be updated by Varnish automatically
}
sub vcl_deliver {
    if (obj.hits > 0) {
        set resp.http.X-Cache = "HIT"; # These can be custom
    } else {
        set resp.http.X-Cache = "MISS";
    }
    set resp.http.Age = req.http.Age; # Set age 
    set resp.http.X-Varnish = req.http.X-Varnish; # Set X-Varnish
}
© www.soinside.com 2019 - 2024. All rights reserved.