好的:我有一个站点设置,其中包含我们向开发人员公开的一些API,这些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并让后端完成其余的事情(这是一个hackaround,因为Rails / authlogic发送带有API响应的会话cookie).
目前,任何不同的开发人员基本上都会遇到不同的缓存,因为& key = SOMEALPHANUM被认为是用于存储的Varnish哈希的一部分.这显然不是一个很好的解决方案,我正试图找出如何告诉Varnish忽略URI的那一部分.
最佳答案
如果你需要将key = SOMEALPHANUM保留在后端以防万一没有从缓存中传递,那么最好在vcl_hash函数中调用regsub,因为这不会真正改变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;
}