如何使用清漆缓存忽略特定的查询参数?

How to ignore specific query parameter with varnish cache?

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

我需要用清漆缓存这个请求,但我需要忽略最后一个查询参数_=1524469655019

我不确定 varnish 内部是如何工作的,但我想它会根据请求的 url 生成缓存 uid 键。所以在我的例子中,它只需要从这个 url

创建 uid 键

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

做类似 req.url ~ "^/swatches/(.*)$" 的事情是行不通的,因为 varnish 仍然会使用整个 url 作为缓存 uid。

只需从 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

中做

beware if you have a custom vcl_hash, to include the default rules, as the custom removes the default hash parameters. http.host || client.ip

VCL hash is the part the generates the 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。