忽略 Varnish VCL 中的 GET 参数

忽略 Varnish VCL 中的 GET 参数

好的:我已经建立了一个网站,其中包含一些我们向开发人员公开的 API,其格式为

/api/item.xml?type_ids=34,35,37&region_ids=1000002,1000003&key=SOMERANDOMALPHANUM

在这个URI中,type_ids总是设置的,region_ids和key是可选的。

需要注意的是,关键变量不会影响响应的内容。它用于内部跟踪请求,以便我们能够识别发出缓慢或其他不必要请求的人。

在 Varnish 中,我们有一个像这样的 VCL:

if (req.http.host ~ "the-site-in-question.com") {
  if (req.url ~ "^/api/.+\.xml") {
    unset req.http.cookie;
  }
}

我们只是去掉 cookie,让后端按照时间安排完成剩下的工作(这是一个变通方法,因为 Rails/authlogic 会通过 API 响应发送会话 cookie)。

不过目前,由于&key=SOMEALPHANUM被视为 Varnish 存储哈希的一部分,因此任何不同的开发人员基本上都会访问不同的缓存。这显然不是一个很好的解决方案,我正在尝试找出如何告诉 Varnish 忽略 URI 的这一部分。

答案1

如果您需要将key=SOMEALPHANUM完整的内容留给后端以防无法从缓存中传送,那么最好在函数regsub内进行vcl_hash因为这实际上不会改变 url,而只是改变密钥的哈希值。

sub vcl_hash {
  if(req.http.host ~ "the-site-in-question.com" & req.url ~ "^/api/") {
    set req.http.X-Sanitized-URL = req.url;
    set req.http.X-Sanitized-URL = regsub(req.http.X-Sanitized-URL, "&key=[A-Za-z0-9]+", "");
    set req.hash += req.http.X-Sanitized-URL;
  } else {
    set req.hash += req.url;
  }
  set req.hash += req.http.host;
  hash;
}

答案2

在 vcl_recv 中

设置req.url = regsub(req.url, "&key=.*$", "");

答案3

与 cd34 的答案类似,但考虑到查询参数的顺序可能不同,并依赖于问题将值定义为字母数字的事实:

set req.url = regsub(req.url, "&key=[A-Za-z0-9]*", ""); 

(我暂时还不能发表评论,否则这将是对 cd34 的回答的评论)

相关内容