使用清漆从 Cache-Control header 中删除 s-maxage

Remove s-maxage from Cache-Control header using Varnish

我们目前在 Cache-Control header 中使用 s-maxage 指令来控制 Varnish 中的 TTL。但是,我想在传递之前将其从响应中删除,以便请求链中的其他缓存不会对其起作用。

我目前正在查看 header VMOD,以从 header 中删除 s-maxage,但保持其余部分不变。我相信这可以通过这样的方式实现:

sub vcl_deliver {
    header.regsub(resp, "s-maxage=[0-9]+,?\s?", "")
}

作为 Varnish 的新手,我想 sanity-check 这种方法并确保没有更好的方法来解决它?

感谢任何支持或建议。

交货时更换header

下面的 VCL 片段将在 Cache-Control header 发送到客户端之前从 s-maxage 属性中剥离。

sub vcl_deliver {
    set resp.http.cache-control = regsub(resp.http.cache-control,
"(,\s*s-maxage=[0-9]+\s*$)|(\s*s-maxage=[0-9]+\s*,)","");
}

存储时替换header

也可以在 Cache-Control header 将此属性存储到缓存 object 之前将其剥离。在这种情况下,您将在 vcl_backend_response.

中使用 beresp.http.cache-control 变量
sub vcl_backend_response {
    set beresp.http.cache-control = regsub(beresp.http.cache-control,
"(,\s*s-maxage=[0-9]+\s*$)|(\s*s-maxage=[0-9]+\s*,)","");
}

使用vmod_headerplus

如果您正在使用 Varnish Enterprise,您可以使用 vmod_headerplus 模块轻松删除 header 属性:

vcl 4.1;

import headerplus;

sub vcl_deliver {
    headerplus.init(resp);
    headerplus.attr_delete("Cache-Control","s-maxage",",");
    headerplus.write();
}
vcl 4.1;

import headerplus;

sub vcl_backend_response {
    headerplus.init(beresp);
    headerplus.attr_delete("Cache-Control","s-maxage",",");
    headerplus.write();
}

尽管 Varnish EnterpriseVarnish Cache 的商业版本,但如果您在AWS、Azure 或 GCP。