如何在varnish中保留特定的查询参数

时间:2015-08-07 13:51:29

标签: regex varnish strip query-parameters

我的问题可能有点奇怪。通常,您希望从URL中删除特定查询参数以在Varnish中缓存。但我想做与此相反的事情。这是使用一些查询参数(如utm_source等)重定向所必需的

我有一组查询参数,不需要剥离,其余的可以被剥离。

2 个答案:

答案 0 :(得分:2)

经过一段时间的反复试验后,我找到了一种方法。

首先,我们在 sub vcl_recv 中使用此代码来删除所有营销查询参数以清理网址:

# Store original url in temporary header
set req.http.X-Original-Url = req.url;

# Strip all marketing get parameters
if(req.url ~ "(\?|&)(gclid|cx|ie|cof|siteurl|zanpid|origin|utm_[a-z]+|mr:[A-z]+)=") {
    set req.url = regsuball(req.url, "(gclid|cx|ie|cof|siteurl|zanpid|origin|utm_[a-z]+|mr:[A-z]+)=[%.-_A-z0-9]+&?", "");
}
set req.url = regsub(req.url, "(\?&|\?|&)$", "");

接下来在 sub vcl_fetch 中,我们使用此代码在重定向后重新附加营销查询参数,但删除所有其他查询参数。

if (beresp.status == 301 || beresp.status == 302) {
    set beresp.http.location = beresp.http.location + "?" + regsub(req.http.X-Original-Url, ".*\?(.*)", "\1");
    set beresp.http.location = regsuball(beresp.http.location, "([&|?](?!gclid|cx|ie|cof|siteurl|zanpid|origin|utm_[a-z]+|mr:[A-z]+)[\w\d]+=([%.-_A-z0-9]+)?)", "");  # Comment or remove this line to keep the original query parameters after redirect
    set beresp.http.location = regsub(beresp.http.location, "(\?&|\?|&)$", "");
    return (hit_for_pass);
}

我还制作了一个快速启用/禁用变体,因此人们可以启用/禁用所有非营销查询参数的剥离。请参阅子vcl_fetch 代码

中的评论

答案 1 :(得分:1)

只是使用最新版本的Varnish(例如sub vcl_fetch已重命名)对此进行更新。以下为我们工作:

vcl_recv

# Store original url in temporary header
set req.http.X-Original-Url = req.url;

# strip out query string
set req.url = regsub(req.url, "\?.*$", "");

vcl_backend_response

# restore URL params after a redirect
if (resp.status == 301 || resp.status == 302) {
  set resp.http.location = resp.http.location + "?" + regsuball(req.http.X-Original-Url, "(^.*(?=\?)|[?&](?!header1|header2)\w+=[^&]*)", "");
  # strip occurrences of `?&` after removing params
  set resp.http.location = regsub(resp.http.location, "(\?&|\?\?)", "?");
  # some more cleanup (empty `?` or `&` at end)
  set resp.http.location = regsub(resp.http.location, "(\?&|\?|&)$", "");
}

其中

  • ^.*(?=\?)仅保留查询字符串" ?"之后的所有内容(例如?key1=value1&key2=value2
  • [?&](?!header1|header2)\w+匹配与header1header2不匹配的关键名称
  • =[^&]*=字符和value匹配,直到&
  • 的下一次出现

以下regsubs用于清理。希望他们能自我解释。