配置 Varnish 以重写客户端缓存的 Expires/Cache-Control 标头

配置 Varnish 以重写客户端缓存的 Expires/Cache-Control 标头

如何配置 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 做得更好。

相关内容