Caching 用清漆忽略utm_*值?

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=

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

例如,所有营销
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的人(或广告网络)可能不会。我将用
[^&=]
替换
[^&]
,因为您希望在下一个查询参数之前删除整个查询参数。