Performance

用清漆忽略 utm_* 值?

  • May 19, 2014

我可以在從記憶體中提取匹配對象之前“忽略”查詢字元串變數,但實際上不能將它們從 URL 中刪除給最終使用者嗎?

例如,所有的行銷utm_source, utm_campaign,utm_*值都不會改變頁面的內容,它們只是隨著活動的不同而有很大的不同,並且被我們所有的客戶端跟踪所使用。

所以這也意味著 URL 不能在客戶端更改,但它應該以某種方式在記憶體中“標準化”。

基本上我想要所有這些……

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

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

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

…所有訪問 HIT 記憶體http://site.com/page/

但是,此 URL 會導致 MISS(因為參數不是 utm_* 參數)

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

會觸發記憶體

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

另外,請記住,使用者看到的 URL 必須保持不變,我無法重定向到沒有參數或任何類似解決方案的東西。

可以,但要做到這一點,您必須覆蓋預設的 vcl_hash。這樣做很危險,因為人們忘記了 Varnish 的工作原理。請記住,預設邏輯附加到您提供的任何內容。因此,如果你想改變這樣的東西,你必須複製整個預設邏輯,根據自己的喜好修改它,然後return在最後通過 ing 來阻止預設邏輯執行。

這是我方便的版本中的預設 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 和它們的 Host 標頭或客戶端連接的 IP 地址來區分。

你想要做的只是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);
}

最後一個警告:請注意,這是UNTESTED。但它至少應該明確地傳達這個想法。如果您發現任何錯誤,請通知我,我很樂意修復程式碼。

引用自:https://serverfault.com/questions/591860