4

我正在使用Varnish 2.0.6,但在找到编写 vcl_hash 函数的好文档时遇到了麻烦。

在缓存之前,我需要从我的 API 的 URL 中删除一些参数。特别是传递给跟踪分析但不更改结果的用户 ID。

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

它缺少什么吗?

4

2 回答 2

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 时还必须处理默认情况。

于 2011-12-14T02:58:35.750 回答
1

以下是适用于我的通用解决方案(从 varnish v4 开始),用于删除几个不需要的参数。

只要值正则表达式匹配,就可以轻松扩展参数列表:值正则表达式匹配所有 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);
}
于 2018-11-13T15:48:46.947 回答