用清漆忽略 utm_* 值?
我可以在從記憶體中提取匹配對象之前“忽略”查詢字元串變數,但實際上不能將它們從 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。但它至少應該明確地傳達這個想法。如果您發現任何錯誤,請通知我,我很樂意修復程式碼。