2014-04-29 59 views
2

在从缓存中提取匹配对象之前,是否可以'忽略'查询字符串变量,但实际上并没有将它们从URL中移除到最终用户?忽略utm_ *值与清漆?

例如,所有的营销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

...所有的访问命中http://example.com/page/

缓存然而,这URL会导致MISS(因为参数不是utm_ *参数)

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

将触发缓存

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

此外,牢记用户看到URL必须保持不变,我不能重定向到一些没有params中,任何这样的解决方案。

回答

2

这样做的伎俩......它根据我自己的问题并不完美,因为它忽略了所有查询参数,而不仅仅是utm。当我需要真正落实这改变了内容的非UTM价值,我必须要重新审视这个表达式:

sub vcl_recv { 
    set req.url = regsub(req.url, "\?.*", ""); 
} 
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_参数后没有任何查询参数,则第三个正则表达式将通过删除?来清除URL。

这两个正则表达式需要在()+之间,因为这将匹配一个或多个连续的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

所以优良:d – Tallboy

+0

这'[^&=]'将不能处理'具有在其中'='符号(想象utm_'参数'utm_track =富= bar',我相信。=符号在URI的查询部分是合法的,即使web表单通常会逃脱它们。有人(或广告网络)伪造一个UTM载入的URI可能不会,我会用'[^&=]'替换'[^&]'因为你想删除整个查询参数直到下一个查询参数。 – mogsie

+0

请参阅http://stackoverflow.com/q/13144172/1391963 – Pere