如何用varnish缓存忽略特定的查询参数?

时间:2018-04-23 08:01:07

标签: varnish varnish-vcl

/swatches/ajax/media/?product_id=17620&isAjax=true&_=1524469655019

我需要使用varnish缓存此请求,但我需要忽略最后一个查询参数_=1524469655019

我不确定varnish内部是如何工作的,但我想它会从请求的url中生成缓存uid密钥。所以在我的情况下,它只需要从这个URL创建uid键

/swatches/ajax/media/?product_id=17620&isAjax=true

执行req.url ~ "^/swatches/(.*)$"之类的操作无效,因为varnish仍然会使用整个url来缓存uid。

1 个答案:

答案 0 :(得分:0)

从QS中删除_=

sub vcl_recv {
  set req.url = regsuball(req.url,"\?_=[^&]+$",""); # strips when QS = "?_=AAA"
  set req.url = regsuball(req.url,"\?_=[^&]+&","?"); # strips when QS = "?_=AAA&foo=bar"

}

请记住,这将剥离QS - 并且QS不会转发到后端。 如果您在后端需要它,则需要在vcl_hash

中进行操作
  

请注意,如果您有自定义vcl_hash,要包含默认规则,因为自定义会删除默认哈希参数。   http.host || client.ip

     

VCL哈希是生成cache-uuid

的部分
sub vcl_hash {
  set req.http.hash_url = regsuball(req.url,"\?_=[^&]+$",""); # strips when QS = "?_=AAA"
  set req.http.hash_url = regsuball(req.http.hash_url,"\?_=[^&]+&","?"); # strips when QS = "?_=AAA&foo=bar"
  hash_data(req.http.hash_url);
  if (req.http.host) {
    hash_data(req.http.host);
  } else {
    hash_data(server.ip);
  }
}    

这样,产生MISS的请求也会将_=传递给后端。 在这么简单的情况下,没有明确需要vmod。