2012-10-30 34 views
12

मेरा लक्ष्य कुछ क्वेरीस्ट्रिंग विशेषताओं और उनके मानों को "श्वेतसूची" करना है ताकि वार्निश यूआरएल के बीच कैश को अलग न करे।चुनिंदा क्वेरीस्ट्रिंग विशेषता/मान जोड़े को स्ट्रिपिंग करना ताकि वार्निश उनके द्वारा कैश को अलग नहीं करेगा

उदाहरण:

Url 1: http://foo.com/someproduct.html?utm_code=google&type=hello 
Url 2: http://foo.com/someproduct.html?utm_code=yahoo&type=hello 
Url 3: http://foo.com/someproduct.html?utm_code=yahoo&type=goodbye 

ऊपर के उदाहरण मैं "utm_code" लेकिन "प्रकार" तो बाद पहली यूआरएल मारा जाता है मैं वार्निश दूसरा यूआरएल है कि कैश की गई सामग्री की सेवा करना चाहते हैं श्वेतसूची में चाहते हैं।

हालांकि, तीसरे यूआरएल के मामले में, विशेषता "प्रकार" मान अलग है ताकि वार्निश कैश मिस होना चाहिए।

मैंने नीचे 2 विधियों की कोशिश की है (एक ड्रोपल सहायता आलेख पर मिला है जिसे मैं अभी नहीं ढूंढ सकता) जो काम नहीं कर रहा था। हो सकता है क्योंकि मेरे पास regex गलत है।

# 1. strip out certain querystring values so varnish does not vary cache. 
set req.url = regsuball(req.url, "([\?|&])utm_(campaign|content|medium|source|term)=[^&\s]*&?", "\1"); 
# get rid of trailing & or ? 
set req.url = regsuball(req.url, "[\?|&]+$", ""); 

# 2. strip out certain querystring values so varnish does not vary cache. 
set req.url = regsuball(req.url, "([\?|&])utm_campaign=[^&\s]*&?", "\1"); 
set req.url = regsuball(req.url, "([\?|&])foo_bar=[^&\s]*&?", "\1"); 
set req.url = regsuball(req.url, "([\?|&])bar_baz=[^&\s]*&?", "\1"); 
# get rid of trailing & or ? 
set req.url = regsuball(req.url, "[\?|&]+$", ""); 

उत्तर

12

मैं इस समझ और साझा करना चाहते थे। मुझे यह कोड मिला जो एक सबराउटिन बनाता है जो मुझे चाहिए।

sub vcl_recv { 

    # strip out certain querystring params that varnish should not vary cache by 
    call normalize_req_url; 

    # snip a bunch of other code 
} 

sub normalize_req_url { 

    # Strip out Google Analytics campaign variables. They are only needed 
    # by the javascript running on the page 
    # utm_source, utm_medium, utm_campaign, gclid, ... 
    if(req.url ~ "(\?|&)(gclid|cx|ie|cof|siteurl|zanpid|origin|utm_[a-z]+|mr:[A-z]+)=") { 
     set req.url = regsuball(req.url, "(gclid|cx|ie|cof|siteurl|zanpid|origin|utm_[a-z]+|mr:[A-z]+)=[%.-_A-z0-9]+&?", ""); 
    } 
    set req.url = regsub(req.url, "(\?&?)$", ""); 
} 
0

आप utm_code उन्हें हटाना चाहते लेकिन यह regexps प्रयोग कर रहे हैं दोनों में से किसी के द्वारा कवर नहीं है।

इस प्रयास करें:

# Strip out specific utm_ values from request URL query parameters 
set req.url = regsuball(req.url, "([\?|&])utm_(campaign|content|medium|source|term|code)=[^&\s]*&?", "\1"); 
# get rid of trailing & or ? 
set req.url = regsuball(req.url, "[\?|&]+$", ""); 

या आप के साथ जा सकते हैं ताकि सभी URL पैरामीटर utm_ के साथ शुरू पट्टी करना चाहते हैं:

# Strip out ALL utm_ values from request URL query parameters 
set req.url = regsuball(req.url, "([\?|&])utm_(\w+)=[^&\s]*&?", "\1"); 
# get rid of trailing & or ? 
set req.url = regsuball(req.url, "[\?|&]+$", ""); 
+0

मैं माफी चाहता हूँ, मैं समझाने की है कि मेरे कोड utm_campaign, utm_content, आदि utm_code के लिए काम करने के लिए गया था सिर्फ एक "सामान्य उदाहरण" मैं बना नहीं मालूम था मतलब है। मुझे अंततः कुछ ऐसा लगता है जो काम करता है और इसे मूल संपादन में जोड़ देगा ... हालांकि आपके इनपुट के लिए धन्यवाद! – runamok

+0

दरअसल आप लगभग यह था। लेकिन जब आप लालची और अंत मैचों के बाद से utm_ का पीछा करते हैं तो यह विफल रहता है क्योंकि अगला मैच मेल नहीं खाता है। की आवश्यकता है: ([\? | &]) Utm _ (\ w +) = [^ & \ s] * – dalore

0

runamok की एक प्रति, लेकिन मैं + 20% के बजाय मेरी पैरामीटर में मिल गया तो मैं जोड़ लिया है कि मेरे regex

sub vcl_recv { 
    # strip out certain querystring params that varnish should not vary cache by 
    call normalize_req_url; 
    # snip a bunch of other code 
} 
sub normalize_req_url { 
    # Strip out Google Analytics campaign variables. 
    # I allso stribe facebook local that are use for facebook javascript. 
    # They are only neededby the javascript running on the page 
    # utm_source, utm_medium, utm_campaign, gclid, ... 
    if(req.url ~ "(\?|&)(gclid|cx|ie|cof|siteurl|zanpid|origin|utm_[a-z]+|fb_local|mr:[A-z]+)=") { 
     set req.url = regsuball(req.url, "(gclid|cx|ie|cof|siteurl|zanpid|origin|utm_[a-z]+|fb_local|mr:[A-z]+)=[%.+-_A-z0-9]+&?", ""); 
    } 
    set req.url = regsub(req.url, "(\?&?)$", ""); 
} 
3

के लिए कुछ RegEx के साथ कुछ गलत नहीं है।
मैं दोनों regsub में इस्तेमाल regexes कॉल बदल दिया है:

sub normalize_req_url { 
    # Clean up root URL 
    if (req.url ~ "^/(?:\?.*)?$") { 
     set req.url = "/"; 
    } 

    # Strip out Google Analytics campaign variables 
    # They are only needed by the javascript running on the page 
    # utm_source, utm_medium, utm_campaign, gclid, ... 
    if (req.url ~ "(\?|&)(gclid|cx|ie|cof|siteurl|zanpid|origin|utm_[a-z]+|mr:[A-z]+)=") { 
     set req.url = regsuball(req.url, "(gclid|cx|ie|cof|siteurl|zanpid|origin|utm_[a-z]+|mr:[A-z]+)=[%\._A-z0-9-]+&?", ""); 
    } 
    set req.url = regsub(req.url, "(\?&|\?|&)$", ""); 
} 

पहला परिवर्तन हिस्सा है "[% ._ ए-z0-9-]" है, क्योंकि पानी का छींटा एक सीमा प्रतीक की तरह कार्य, इसका कारण यही है मैं इसे अंत में ले जाया गया है, और बिंदु से बच जाना चाहिए।

दूसरा परिवर्तन न केवल शेष यूआरएल पर एक प्रश्न चिह्न को हटा देना है, बल्कि एक एम्पर्सेंड या प्रश्न चिह्न और एम्परसैंड भी है।

1

https://github.com/mattiasgeniar/varnish-4.0-configuration-templates से:

# Some generic URL manipulation, useful for all templates that follow 
# First remove the Google Analytics added parameters, useless for our backend 
if (req.url ~ "(\?|&)(utm_source|utm_medium|utm_campaign|utm_content|gclid|cx|ie|cof|siteurl)=") { 
    set req.url = regsuball(req.url, "&(utm_source|utm_medium|utm_campaign|utm_content|gclid|cx|ie|cof|siteurl)=([A-z0-9_\-\.%25]+)", ""); 
    set req.url = regsuball(req.url, "\?(utm_source|utm_medium|utm_campaign|utm_content|gclid|cx|ie|cof|siteurl)=([A-z0-9_\-\.%25]+)", "?"); 
    set req.url = regsub(req.url, "\?&", "?"); 
    set req.url = regsub(req.url, "\?$", ""); 
} 
+0

पुराने 3.x संस्करण के लिए, वाक्यविन्यास समान है: https://github.com/mattiasgeniar/varnish -3.0-विन्यास-टेम्पलेट्स/ब्लॉब/मास्टर/production.vcl # L70 – Pere

0

मैं खाली पैरामीटर के लिए समर्थन जोड़ने और शेष लोगों छँटाई के द्वारा एक सा runamok के जवाब पर सुधार किया है, यहाँ एक पूर्ण VTC फ़ाइल है कि मैं सत्यता को सत्यापित करने के लिए लागू है।

varnishtest "Test for URL normalization - Varnish 4" 

server s1 { 
    rxreq 
    txresp -hdr "Backend: up" -body "Some content" 
} -repeat 11 -start 

varnish v1 -vcl+backend { 
    import std; 

    sub vcl_recv { 
    # Strip out marketing variables. They are only needed by 
    # the javascript running on the page. 
    if (req.url ~ "(\?|&)(gclid|cx|ie|cof|siteurl|zanpid|origin|utm_[a-z]+|mr:[A-z]+)(=|&|$)") { 
     # Process params with value. 
     set req.url = regsuball(req.url, "(gclid|cx|ie|cof|siteurl|zanpid|origin|utm_[a-z]+|mr:[A-z]+)=[%.\-_A-z0-9]+&?", ""); 
     # Process params without value. 
     set req.url = regsuball(req.url, "(gclid|cx|ie|cof|siteurl|zanpid|origin|utm_[a-z]+|mr:[A-z]+)=?(&|$)", ""); 
    } 
    # Remove trailing '?', '?&' 
    set req.url = regsub(req.url, "(\?&?)$", ""); 
    # Sort query params, also removes trailing '&' 
    set req.url = std.querysort(req.url); 
    } 

    sub vcl_deliver { 
    set resp.http.X-Normalized-URL = req.url; 
    } 
} -start 

client c1 { 
    # Basic, no params. 
    txreq -url "/test/some-url" 
    rxresp 
    expect resp.http.X-Normalized-URL == "/test/some-url" 

    # One blacklisted param. 
    txreq -url "/test/some-url?utm_campaign=1" 
    rxresp 
    expect resp.http.X-Normalized-URL == "/test/some-url" 

    # One blacklisted param, without value. 
    txreq -url "/test/some-url?utm_campaign" 
    rxresp 
    expect resp.http.X-Normalized-URL == "/test/some-url" 

    # Two blacklisted params. 
    txreq -url "/test/some-url?utm_campaign=1&origin=hpg" 
    rxresp 
    expect resp.http.X-Normalized-URL == "/test/some-url" 

    # Two blacklisted params, one without value 
    txreq -url "/test/some-url?utm_campaign&origin=123-abc%20" 
    rxresp 
    expect resp.http.X-Normalized-URL == "/test/some-url" 

    # Two blacklisted params, both without value 
    txreq -url "/test/some-url?utm_campaign&origin=" 
    rxresp 
    expect resp.http.X-Normalized-URL == "/test/some-url" 

    # Three blacklisted params. 
    txreq -url "/test/some-url?utm_campaign=ABC&origin=hpg&siteurl=br2" 
    rxresp 
    expect resp.http.X-Normalized-URL == "/test/some-url" 

    # Three blacklisted params, two without value 
    txreq -url "/test/some-url?utm_campaign=1&origin=&siteurl" 
    rxresp 
    expect resp.http.X-Normalized-URL == "/test/some-url" 

    # Three blacklisted params; one param to keep, with space encoded as +. 
    txreq -url "/test/some-url?qss=hello+one&utm_campaign=some-value&origin=hpg&siteurl=br2" 
    rxresp 
    expect resp.http.X-Normalized-URL == "/test/some-url?qss=hello+one" 

    # Three blacklisted params; one param to keep, with space encoded as %20, passed in-between blacklisted ones. 
    txreq -url "/test/some-url?utm_campaign=1&qss=hello%20one&origin=hpg&siteurl=br2" 
    rxresp 
    expect resp.http.X-Normalized-URL == "/test/some-url?qss=hello%20one" 

    # Three blacklisted params; three params to keep. 
    txreq -url "/test/some-url?utm_campaign=a-value&qss=hello+one&origin=hpg&siteurl=br2&keep2=abc&keep1" 
    rxresp 
    expect resp.http.X-Normalized-URL == "/test/some-url?keep1&keep2=abc&qss=hello+one" 
} -run 

varnish v1 -expect client_req == 11