如何在Varnish缓存中忽略特定的查询参数?

3

/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。


您可以使用这个模块 https://github.com/NYTimes/libvmod-queryfilter。 - Ôrel
https://serverfault.com/questions/112531/ignoring-get-parameters-in-varnish-vcl - Ôrel
您可以通过使用nuster缓存服务器轻松实现此目标,https://github.com/jiangwenyuan/nuster - nuster cache server
1个回答

1

只需从 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 哈希是生成缓存 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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接