如何在 Varnish 上缓存对象,但告诉客户端不要缓存它
How to cache an object on Varnish, but tell the client not the cache it
我在 Varnish 上缓存产品详细信息页面,然后每当产品更新时,我都会从后端服务器清除缓存。我希望我的客户永远不要在他们这边缓存这个页面,而是总是从 Varnish 询问,这样我就可以为他们提供最新的副本。
目前,我有以下 vcl_backend_response 的配置:
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 中可以实现吗?
尝试添加 headers
Cache-Control: no-cache, must-revalidate
是的,有可能:
- 在
vcl_backend_response
. 中通过 Varnish 定义缓存时间的逻辑
- 在
vcl_deliver
. 中定义 由浏览器缓存 缓存多长时间的逻辑
因此可以指示客户端(浏览器)使用与 Varnish 不同的 TTL 进行缓存。以下将确保浏览器不会缓存响应:
sub vcl_deliver {
set resp.http.Pragma = "no-cache";
set resp.http.Expires = "-1";
set resp.http.Cache-Control = "no-store, no-cache, must-revalidate, max-age=0";
}
此外,如果您可以修改您的应用程序,则可以采用第一个解决方案 here 中概述的更好的方法,即发送定义缓存的单个 Cache-Control
header共享缓存(清漆)和私有缓存(浏览器)的 TTL 不同:
Cache-Control: s-maxage=31536000, max-age=86400
The header above will instruct a browser to cache resource for 86400 seconds, while Varnish will cache for 31536000. This is because s-maxage only applies to shared caches. Varnish evaluates it, while browsers don’t.
我在 Varnish 上缓存产品详细信息页面,然后每当产品更新时,我都会从后端服务器清除缓存。我希望我的客户永远不要在他们这边缓存这个页面,而是总是从 Varnish 询问,这样我就可以为他们提供最新的副本。
目前,我有以下 vcl_backend_response 的配置:
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 中可以实现吗?
尝试添加 headers Cache-Control: no-cache, must-revalidate
是的,有可能:
- 在
vcl_backend_response
. 中通过 Varnish 定义缓存时间的逻辑
- 在
vcl_deliver
. 中定义 由浏览器缓存 缓存多长时间的逻辑
因此可以指示客户端(浏览器)使用与 Varnish 不同的 TTL 进行缓存。以下将确保浏览器不会缓存响应:
sub vcl_deliver {
set resp.http.Pragma = "no-cache";
set resp.http.Expires = "-1";
set resp.http.Cache-Control = "no-store, no-cache, must-revalidate, max-age=0";
}
此外,如果您可以修改您的应用程序,则可以采用第一个解决方案 here 中概述的更好的方法,即发送定义缓存的单个 Cache-Control
header共享缓存(清漆)和私有缓存(浏览器)的 TTL 不同:
Cache-Control: s-maxage=31536000, max-age=86400
The header above will instruct a browser to cache resource for 86400 seconds, while Varnish will cache for 31536000. This is because s-maxage only applies to shared caches. Varnish evaluates it, while browsers don’t.