Caching 如何在Varnish上缓存对象,但告诉客户机不要缓存它
我正在Varnish上缓存产品详细信息页面,然后每当产品更新时,我都会从后端服务器清除缓存。我希望我的客户永远不要在他们这边缓存此页面,而是总是从Varnish请求,这样我就可以为他们提供最新的副本 目前,我有以下vcl_后端_响应配置:Caching 如何在Varnish上缓存对象,但告诉客户机不要缓存它,caching,varnish,no-cache,Caching,Varnish,No Cache,我正在Varnish上缓存产品详细信息页面,然后每当产品更新时,我都会从后端服务器清除缓存。我希望我的客户永远不要在他们这边缓存此页面,而是总是从Varnish请求,这样我就可以为他们提供最新的副本 目前,我有以下vcl_后端_响应配置: sub vcl_backend_response { unset beresp.http.Set-Cookie; #unset beresp.http.Cache-Control; #set beresp.http.Cache-Cont
sub vcl_backend_response {
unset beresp.http.Set-Cookie;
#unset beresp.http.Cache-Control;
#set beresp.http.Cache-Control = "no-cache";
if (bereq.url ~ "^/products/\d+/details") {
set beresp.ttl = 1h;
}
}
但是,使用此配置,客户机会将响应缓存1小时,并且不会再次询问,甚至在Varnish上清除缓存
如果我取消对缓存控制相关行的注释,那么这次Varnish不会缓存页面,并且总是要求从后端服务器获取新的副本
这在Varnish v6.0中可以实现吗?尝试添加标题
缓存控制:无缓存,必须重新验证是,可能:
- 定义Varnish在
vcl\u后端\u响应中缓存的时间逻辑
- 定义浏览器缓存在
中缓存的时间逻辑vcl\u deliver
sub-vcl\u交付{
设置resp.http.Pragma=“无缓存”;
设置resp.http.Expires=“-1”;
set resp.http.Cache-Control=“无存储,无缓存,必须重新验证,最大年龄=0”;
}
此外,如果您可以修改应用程序,您可以采用第一个解决方案中介绍的更精细的方法,即发送一个缓存控制
标头,该标头以不同的方式定义共享缓存(Varnish)和专用缓存(browser)的缓存TTL:
Cache-Control: s-maxage=31536000, max-age=86400
上面的标题将指示浏览器缓存资源86400秒,而Varnish将缓存31536000秒。这是因为s-maxage仅适用于共享缓存。Varnish会对其进行评估,而浏览器不会
我应该在哪个子例程中添加缓存控制头?我已经测试了“应用程序发送缓存控制头”场景,它工作得非常好。谢谢@Daniel V.Daniel也可以为不同的路径设置不同的宽限期吗?如