如何配置 Varnish 以便所有与“*.css”匹配的请求的响应都缓存在客户端的浏览器中 30 天?
我想要实现的是让 Varnish 设置正确的“Expires:”和/或“Cache-Control”设置,以便所有 CSS:都缓存 30 天,而不管后端对这些对象的客户端可缓存性有何评价。
答案1
这是诀窍:
sub vcl_fetch {
..
if (req.url ~ "\.css$") {
set obj.http.magicmarker = "1";
}
..
}
sub vcl_deliver {
..
if (resp.http.magicmarker) {
unset resp.http.magicmarker;
set resp.http.Cache-Control = "...";
set resp.http.Expires = "...";
set resp.http.Age = "...";
}
..
}
答案2
我只需要指出,varnish 实际上非常适合重写标头。在 vcl_recv 中可以测试任何 URL,而在 vcl_fetch 中,它是 varnish 的常见应用程序。在 recv 中,您可以分析传入的请求。在 fetch 中,您可以分析后端响应。
通常,您在 recv 中操作请求,并将其定向到后端,然后在 fetch 中操作响应,并重写标头以适应,然后将对象存储在缓存中并传递响应。
在 fetch 中你可以做
unset beresp.http.expires;
unset beresp.http.cache-control;
也
set beresp.http.Cache-Control = "max-age = 2678406";
等等。
答案3
我认为 Varnish 不会让您将 VCL 规则的范围限定为“*.css”。您可能需要在 Varnish 邮件列表中询问有关此问题的确切信息。应该可以按 MIME 类型限定范围。
假设您的对象已经设置了缓存标头,但您希望对其进行规范化,那么此 Varnish 文档 VCL 的修改版本应该可以帮助您: http://varnish.projects.linpro.no/wiki/VCLExampleLongerCaching
总体而言,Varnish 并非为执行大量标头或内容重写而构建。您的 Web 服务器或 Web 应用程序应该比 Varnish 做得更好。