Caching 用清漆忽略utm_*值?
在从缓存中提取匹配对象之前,我是否可以“忽略”查询字符串变量,而不是将它们从URL中实际删除给最终用户 例如,所有营销Caching 用清漆忽略utm_*值?,caching,url-rewriting,varnish,varnish-vcl,Caching,Url Rewriting,Varnish,Varnish Vcl,在从缓存中提取匹配对象之前,我是否可以“忽略”查询字符串变量,而不是将它们从URL中实际删除给最终用户 例如,所有营销utm_源代码,utm_活动,utm_*值不会改变页面的内容,它们只是在不同的活动中变化很大,并被我们所有的客户端跟踪使用 因此,这也意味着URL不能在客户端更改,但它应该在缓存中以某种方式“规范化” 基本上我想要所有这些 http://example.com/page/?utm_source=google http://example.com/page/?utm_source=
utm_源代码
,utm_活动
,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
。。。要进行所有访问,请点击缓存中的http://example.com/page/
但是,此URL将导致未命中(因为该参数不是utm_*param)
http://example.com/page/?utm_source=google&variation=5
将触发缓存的
http://example.com/page/?variation=5
另外,请记住,用户看到的URL必须保持不变,如果没有参数或任何类似的解决方案,我无法重定向到某个内容。这就成功了。。。根据我自己的问题,它并不完美,因为它忽略了所有的查询参数,而不仅仅是utm参数。当我需要实际实现更改内容的非utm值时,我需要重新访问此正则表达式:
sub vcl_recv {
set req.url = regsub(req.url, "\?.*", "");
}
这就成功了。。。根据我自己的问题,它并不完美,因为它忽略了所有的查询参数,而不仅仅是utm参数。当我需要实际实现更改内容的非utm值时,我需要重新访问此正则表达式:
sub vcl_recv {
set req.url = regsub(req.url, "\?.*", "");
}
因此,我将添加一个免责声明,即这个正则表达式可能并不完美,但它应该工作得很好:
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\uu
开头的查询参数。我使用了三个正则表达式使它更清晰、更容易阅读
第一个regsuball
删除查询字符串开头的任何utm
参数。它会在?
之后立即查找一个或多个utm\uuu
参数。第二个regsuball
删除任何不在查询字符串开头的utm
参数
第三个正则表达式将通过删除?
来清理URL,如果在我们删除utm\uu
参数之后没有剩下任何查询参数
这两个正则表达式都需要位于()+
中,因为这将匹配一个或多个连续的utm\uuu
参数(否则它们不会匹配)
示例结果:
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
因此,我将添加一个免责声明,即这个正则表达式可能并不完美,但它应该工作得很好:
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\uu
开头的查询参数。我使用了三个正则表达式使它更清晰、更容易阅读
第一个regsuball
删除查询字符串开头的任何utm
参数。它会在?
之后立即查找一个或多个utm\uuu
参数。第二个regsuball
删除任何不在查询字符串开头的utm
参数
第三个正则表达式将通过删除?
来清理URL,如果在我们删除utm\uu
参数之后没有剩下任何查询参数
这两个正则表达式都需要位于()+
中,因为这将匹配一个或多个连续的utm\uuu
参数(否则它们不会匹配)
示例结果:
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
这个
[^&=]
不会处理带有=/code>符号的utm
参数(想象一下?utm\u track=foo=bar
,我相信。=符号在URI的查询部分是合法的,即使web表单通常不包含它们。有人(或广告网络)伪造一个装载了utm的URI可能不会。我会替换[^&=]
使用[^&]
,因为您希望在下一个查询参数之前删除整个查询参数。此[^&=]
不会处理带有=
符号的utm
参数(想象一下,?utm_track=foo=bar
,我相信。=符号在URI的查询部分是合法的,即使web表单通常不包含它们。伪造utm加载URI的人(或广告网络)可能不会。我将用[^&=]
替换[^&]
,因为您希望在下一个查询参数之前删除整个查询参数。