【问题标题】:Varnish vcl_hash to remove a parameter清漆 vcl_hash 以删除参数
【发布时间】:2012-01-19 15:19:23
【问题描述】:

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

是不是少了什么?

【问题讨论】:

    标签: varnish varnish-vcl


    【解决方案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 时还必须处理默认情况。

    【讨论】:

    • 我仍然不明白为什么我必须使用 "req.hash +=" 就像我附加到一些现有值一样。什么价值??
    • 你用的是什么版本的清漆?
    【解决方案2】:

    以下是适用于我的通用解决方案(从 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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-08
      • 2013-01-09
      • 1970-01-01
      • 2012-11-12
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2020-03-10
      相关资源
      最近更新 更多