好的:我已经build立了一个站点,其中有一些我们向开发人员公开的API,它们是这种格式的
/api/item.xml?type_ids=34,35,37®ion_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的答案)