如何在Varnish中剥离UTM类标签且保留所需查询参数?
Varnish 精准移除UTM类参数并保留其他查询参数
你的现有规则问题在于用\?.*直接删除了整个查询字符串,导致所有参数都被清空。要实现只移除utm、gclid、fbclid、mc相关参数,同时保留其他参数,可以用以下VCL规则:
if (req.url ~ "(utm|gclid|fbclid|mc)(_|=)") { # 移除位于查询串开头的目标参数(如 ?utm_source=xxx) set req.url = regsub(req.url, "\?(utm|gclid|fbclid|mc)[^&]*&?", "?"); # 全局移除位于查询串中间/结尾的目标参数(如 &gclid=xxx 或 &mc_id=123) set req.url = regsuball(req.url, "&(utm|gclid|fbclid|mc)[^&]*", ""); # 清理可能残留的末尾问号(当所有参数都被移除时) set req.url = regsub(req.url, "\?$", ""); }
规则说明:
- 第一步
regsub:匹配以?开头的目标参数,处理后会保留后续的合法参数。比如?utm_campaign=test&app=346会被替换为?app=346;如果只有目标参数,会变成?留待后续清理。 - 第二步
regsuball:全局匹配所有以&开头的目标参数,无论在查询串的哪个位置,都会被直接移除。比如app=346&fbclid=abc123&page=2会变成app=346&page=2。 - 第三步
regsub:当所有查询参数都被移除后,会清理掉末尾多余的?,避免出现page.html?这种无效URL。
这样就能确保只有指定的UTM类参数被移除,其他需要保留的参数会完整传递给后端,同时避免因唯一UTM标签生成重复缓存条目。
内容的提问来源于stack exchange,提问作者user14709644
相关产品推荐
相关产品推荐

