如何设置Varnish缓存控制头

9
我希望有人能够指导如何正确地让Varnish发送缓存控制头部。目前,我的配置正在向客户端发送"Cache-Control: no-cache"

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


如果你能解释一下你想要的是什么,那可能会有所帮助。哪个配置(Varnish还是后端)发送了no-cache头部?你可以在Varnish中覆盖这些头部,但是否正确取决于响应的语义(它们是否可重复使用,对客户端来说持续多久等)。 - ivy
@ivy,谢谢你的回复。我想要实现的目标是让Varnish发送缓存控制头部,无论后端发送给Varnish什么内容。 - Kevin Gleeson
3个回答

15

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

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

解决方法很简单:在从后端获取响应后(在将其存储在缓存之前),删除缓存控制标头。

在您的vcl文件中执行以下操作:

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

你可以选择仅对某些网址执行此操作(将其包裹在( if req.url ~ "" )逻辑中),并做更高级的操作。


7
从Varnish 4.0版本开始,vcl_fetch被替换为vcl_backend_response - Kyle Hayes
4
从Varnish 6.5开始,“remove”被替换为“unset”。 - Vladimir Hidalgo

4
Varnish忽略Cache-Control: nocache,根据文档。这里有证据证实:

http://drupal.org/node/1418908

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

这个问题现在已经关闭了。我认为发帖人意识到自己犯了一个错误。 - Mike Gifford

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接