2012-10-30 15 views
12

Il mio obiettivo è "annotare" determinati attributi di querystring e i relativi valori in modo che la vernice non varii la cache tra gli URL.Estrarre le coppie di attributi/valori di querystring in modo che la vernice non varii la cache da loro

Esempio:

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 

Nell'esempio di cui sopra voglio whitelist "utm_code", ma non "tipo" Così, dopo il primo URL viene colpito voglio vernice per servire quel contenuto memorizzato nella cache al secondo URL.

Tuttavia, nel caso del terzo url, il valore di "tipo" dell'attributo è diverso in modo che dovrebbe essere una mancanza di cache di vernice.

Ho provato i 2 metodi di seguito (trovato su un articolo di aiuto drupal che non riesco a individuare in questo momento) che non sembra funzionare. Potrebbe essere perché ho sbagliato l'espressione regolare.

# 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, "[\?|&]+$", ""); 

risposta

12

ho capito questo e ha voluto condividere. Ho trovato questo codice che rende una subroutine che fa ciò di cui ho bisogno.

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

Si desidera mettere a nudo fuori utm_code ma non è coperto da una delle espressioni regolari che si sta utilizzando.

Prova questo:

# 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, "[\?|&]+$", ""); 

Oppure, se si vuole mettere a nudo tutti i parametri URL che iniziano con utm_ si può andare con:

# 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

Mi dispiace, volevo spiegare che il mio codice non sembra funzionare per utm_campaign, utm_content, ecc utm_code era solo un "esempio generico" ho fatto. Alla fine ho trovato qualcosa che funzionava e lo aggiungo alla modifica originale ... Grazie per il tuo contributo! – runamok

+0

In realtà l'hai quasi avuto. Ma fallisce nel momento in cui hai seguito male_ dato che le partite avide e alla fine fanno sì che il prossimo su non corrisponda. necessario: ([\? | &]) Utm _ (\ w +) = [^ & \ s] * – dalore

0

Una copia del runamok ma ho ottenuto + anziché% 20 nei miei params così ho aggiunto che al mio 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

C'è qualcosa di sbagliato con la regex.
Ho cambiato il regex utilizzati sia regsub chiama:

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, "(\?&|\?|&)$", ""); 
} 

Il primo cambiamento è la parte "[% ._ A-z0-9-]", perché il trattino funzionato come un simbolo gamma, è per questo che L'ho spostato fino alla fine e il punto dovrebbe essere sfuggito.

La seconda modifica consiste nel rimuovere non solo un punto interrogativo nell'URL rimanente, ma anche una e commerciale o un punto interrogativo e la e commerciale.

1

Da 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

Per la versione 3.x precedente, la sintassi è la stessa: https://github.com/mattiasgeniar/varnish -3.0-configurazione-templates/blob/master/production.vcl # L70 – Pere

0

ho migliorato la risposta di runamok un po 'aggiungendo il supporto per params vuoti e l'ordinamento le rimanenti, ecco un file VTC completo che ho implementato per convalidare la correttezza.

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