我正在使用 Varnish 2.0.6 ,我在查找编写vcl_hash函数的良好文档方面遇到了麻烦。
我需要在缓存之前从我的API的URL中删除一些参数。特别是传递给跟踪分析但不更改结果的用户标识。
URL: /api/browse?node=123&userid=3432432564363
我写了这个,但是如果vcl_hash函数需要以'hash'或'return(hash)'或NOTHING结束并且如果我需要处理所有情况或仅仅是我的特殊情况,那么对我来说并不是一件好事。我不清楚我是否覆盖了这种方法,或者我正在扩展它。
我有:
sub vcl_hash {
if (req.url ~ "^/api/browse") {
set req.hash += regsuball(req.url,"&userid=([A-z0-9]+)","");
}
hash;
}
是否遗漏了什么?
答案 0 :(得分:1)
我测试了一些东西,这个似乎有效:
sub vcl_hash {
if (req.url ~ "^/api/browse") {
set req.hash += regsuball(req.url,"&userid=([A-z0-9]+)","");
} else {
set req.hash += req.url;
}
set req.hash += req.http.host;
hash;
}
因此,当您重写vcl_hash时,您似乎还必须处理默认情况。
答案 1 :(得分:0)
以下是一个对我有用的常规解决方案(从varnish v4开始),删除了一些不需要的参数。
只要value-regex匹配,就可以轻松扩展参数列表:regex值匹配所有URL安全字符,因此它应该匹配所有URL编码的参数。
sub vcl_hash {
# conditional replacement is faster then evaluating regexes all the time
if (req.method == "GET" || req.method == "HEAD") {
hash_data(regsuball(req.url, "(userid|sid|uid)=[%.-_~A-z0-9]+&?", ""));
}
else {
hash_data(req.url);
}
hash_data(req.http.host);
return (lookup);
}