有没有办法强制Varnish读取403响应的Cache-Control标头?

时间:2016-07-15 13:11:58

标签: varnish http-status-code-403 cache-control varnish-vcl varnish-4

从代码看起来,由于403不是白名单状态,因此会忽略Cache-Control标头:

switch (http_GetStatus(hp)) {
    default:
        expp->ttl = -1.;

https://github.com/varnishcache/varnish-cache/blob/4.0/bin/varnishd/cache/cache_rfc2616.c#L112-L114

这是我能想到的最好的:

sub vcl_backend_response {
  if (beresp.status == 403) {
    set beresp.http.X-Status = beresp.status;
    set beresp.status = 200;
  }
}

sub vcl_deliver {
    if (resp.http.X-Status) {
      set resp.status = std.integer(resp.http.X-Status, 403);
      unset resp.http.X-Status;
    }
}

虽然这可以正确设置和取消设置状态,但每个请求都是缓存MISS

请参阅#2018

1 个答案:

答案 0 :(得分:2)

默认情况下,varnish中没有缓存403响应。

"您可以缓存除上面列出的状态代码之外的其他状态代码,但您必须在vcl_backend_response中将beresp.ttl设置为正值。 "

请参阅http://book.varnish-software.com/4.0/chapters/VCL_Basics.html#the-initial-value-of-beresp-ttl