在从缓存中提取匹配对象之前,我可以“忽略”查询字符串变量,但实际上是不是将它们从URL中删除到最终用户?
例如,所有营销utm_source
,utm_campaign
,utm_*
值都不会更改页面内容,它们在广告系列与广告系列之间的差异很大,并且由我们所有的客户端跟踪。
所以这也意味着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
另外,请记住,用户看到的网址必须保持不变,我无法重定向到没有参数或任何类型的解决方案的内容。
答案 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, "\?.*", "");
}