使用清漆忽略 utm_* 值吗?

使用清漆忽略 utm_* 值吗?

我可以在从缓存中提取匹配对象之前“忽略”查询字符串变量,但实际上并不将它们从最终用户的 URL 中删除吗?

例如,所有营销utm_source、、utm_campaignutm_*都不会改变页面内容,它们只是在不同活动之间差异很大,并被我们所有的客户端跟踪所使用。

所以这也意味着 URL 不能在客户端改变,但它应该以某种方式在缓存中“规范化”。

本质上我想要所有这些......

http://site.com/page/?utm_source=google

http://site.com/page/?utm_source=facebook&utm_content=123

http://site.com/page/?utm_campaign=usa

... 所有访问命中缓存http://site.com/page/

但是,此 URL 会导致 MISS(因为参数不是 utm_* 参数)

http://site.com/page/?utm_source=google&variation=5

将触发缓存

http://site.com/page/?variation=5

另外,请记住用户看到的 URL 必须保持不变,我无法重定向到没有参数或任何类似解决方案的内容。

答案1

是的,但要做到这一点,您必须覆盖默认的 vcl_hash。这是一件危险的事情,因为人们忘记了 Varnish 的工作原理。请记住,默认逻辑是附加无论您提供什么。因此,如果您想更改这样的内容,您必须完整复制默认逻辑,根据自己的喜好进行修改,然后return在最后通过 ing 来阻止默认逻辑运行。

这是我手头有的版本中的默认 vcl_hash。据我所知,这是自 v1.0 以来的相同代码,因此它可能与您的代码相匹配;请检查您的 default.vcl 以确保无误。

sub vcl_hash {
    hash_data(req.url);
    if (req.http.host) {
        hash_data(req.http.host);
    } else {
        hash_data(server.ip);
    }
    return (lookup);
}

这非常简单:对象通过其 URL 和其主机头或客户端连接到的 IP 地址来区分。

您要做的就是将第一行(hash_data(req.url))替换为(伪):

set myurl = req.url minus utm bits;
hash_data(myurl);

但是,您不能这样做,因为如果您这样做,接下来会发生的事情是它将散列整个 URL!请记住,默认 VCL 始终运行。所以,我们必须将其全部替换:

sub vcl_hash {
    set stripped_url = regsuball(req.url,"([?&])utm_[^&?;]*","\1");
    # Now we potentially have foo.php?bar=baz&&&&thing=true
    set stripped_url = regsuball(stripped_url,"&[&]*","&");
    # Lastly, let's fix foo.php?utm_foo=bar -> foo.php?
    set stripped_url = regsuball(stripped_url,"\?$","");
    hash_data(stripped_url);
    if (req.http.host) {
        hash_data(req.http.host);
    } else {
        hash_data(server.ip);
    }
    return (lookup);
}

最后一点警告:请注意,这是未经测试。但它至少应该明确地传达这个想法。如果你发现任何错误,请通知我,我会很乐意修复代码。

相关内容