用varnish忽略utm_ *值?

时间:2014-04-29 00:25:05

标签: caching url-rewriting varnish varnish-vcl

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

例如,所有营销utm_sourceutm_campaignutm_*值都不会更改页面内容,它们在广告系列与广告系列之间的差异很大,并且由我们所有的客户端跟踪。

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

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

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

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

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

...全部访问HIT http://example.com/page/

的缓存

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

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

会触发

的缓存

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

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

2 个答案:

答案 0 :(得分:3)

所以我会添加一个免责声明,这个正则表达式可能并不完美,但它应该可以很好地工作:

sub vcl_recv {  
  set req.url = regsuball(req.url, "\?(utm_[^=&]*=[^&=]*&?)+", "?");
  set req.url = regsuball(req.url, "&(utm_[^=&]*=[^&=]*(&|$))+", "\2");
  set req.url = regsub(req.url, "\?$", "");

  return (pass);
}

这应该删除以utm_开头的所有查询参数。我使用了三个正则表达式来使它更清晰,更容易阅读。

第一个regsuball删除查询字符串开头的所有utm_参数。它会在utm_之后立即查找一个或多个?参数。第二个regsuball会删除不在查询字符串开头的所有utm_个参数。

如果在删除?参数后没有查询参数,第三个正则表达式会删除utm_来清理网址。

这两个正则表达式都需要在()+中,因为这将匹配一个或多个连续的utm_参数(否则它们将不匹配)。

示例结果:

Source URL: /?utm_track=1&utm_test2=hey&test=utm_blah&utm_source=google&variation=5&utm_query=abc&utm_test7=yes
Maps to:    /?test=utm_blah&variation=5

Source URL: /?variation=5&utm_test1=abc&utm_test2=def&blah=1
Maps to:    /?variation=5&blah=1

答案 1 :(得分:1)

这就是诀窍......根据我自己的问题它并不完美,因为它忽略了所有查询参数,而不仅仅是utm。当我需要实际实现一个更改内容的非utm值时,我需要重新访问这个正则表达式:

sub vcl_recv {
    set req.url = regsub(req.url, "\?.*", "");
}