我的问题可能有点奇怪。通常,您希望从URL中删除特定查询参数以在Varnish中缓存。但我想做与此相反的事情。这是使用一些查询参数(如utm_source等)重定向所必需的
我有一组查询参数,不需要剥离,其余的可以被剥离。
答案 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+
匹配与header1
或header2
不匹配的关键名称=[^&]*
与=
字符和value
匹配,直到&
以下regsubs
用于清理。希望他们能自我解释。