用varnish忽略utm_ *值?

在从caching中提取匹配的对象之前,我可以“忽略”查询stringvariables,但实际上并没有将它们从URL中移除到最终用户?

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

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

基本上我想要所有这些…

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

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

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

…所有访问HITcachinghttp://site.com/page/

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

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

会触发caching

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

另外,请记住,用户所看到的URL必须保持不变,我不能redirect到没有params或任何类似的解决scheme。

是的,但要做到这一点,你必须重写默认的vcl_hash。 这是一个危险的事情,只是因为人们忘记了Varnish如何工作。 请记住,默认的逻辑是附加到你提供的任何东西。 因此,如果你想改变这样的东西,你必须完整地复制默认逻辑,根据自己的喜好进行修改,然后通过return来阻止默认逻辑的运行。

这是从我有一个方便的版本的默认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地址。

你想要做的只是用(伪)replace第一行( 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); } 

最后一个警告:请注意,这是未经检验的 。 但至less应该毫不含糊地传达这个想法。 如果发现任何错误,请通知我,我很乐意修复这些代码。