在Varnish VCL中忽略GET参数

好的:我已经build立了一个站点,其中有一些我们向开发人员公开的API,它们是这种格式的

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

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

重要的是要注意的是,关键variables不影响响应的内容。 它用于对请求进行内部跟踪,以便我们可以识别出请求缓慢或不需要的人员。

在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的方法)。

目前,任何不同的开发人员基本上都会碰到不同的caching,因为&key=SOMEALPHANUM被认为是用于存储的Varnish散列的一部分。 这显然不是一个很好的解决scheme,我正在努力解决如何告诉Varnish忽略URI的那部分。

如果您需要将key=SOMEALPHANUM保留在后端,以防未从caching中传递,则可能会更好地使用vcl_hash函数中的vcl_hash因为这不会真正改变url,而只是改变hash钥匙。

 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; } 

在vcl_recv中

设置req.url = regsub(req.url,“&key =。* $”,“”);

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

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

(我不能评论,否则这将是一个评论cd34的答案)