清除vcl_hash以删除参数

时间:2011-12-13 18:48:38

标签: varnish varnish-vcl

我正在使用 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;
}

是否遗漏了什么?

2 个答案:

答案 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);
}