![忽略 Varnish VCL 中的 GET 参数](https://linux22.com/image/505775/%E5%BF%BD%E7%95%A5%20Varnish%20VCL%20%E4%B8%AD%E7%9A%84%20GET%20%E5%8F%82%E6%95%B0.png)
好的:我已经建立了一个网站,其中包含一些我们向开发人员公开的 API,其格式为
/api/item.xml?type_ids=34,35,37®ion_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 的回答的评论)