Ignorare i parametri GET in vernice VCL

Okay: ho un sito configurato che ha alcune API che esportiamo agli sviluppatori, che sono nel formato

/api/item.xml?type_ids=34,35,37&region_ids=1000002,1000003&key=SOMERANDOMALPHANUM 

In questo URI, type_ids è sempre impostato, region_ids e chiave sono facoltativi.

  • Multi-container docker su AWS - Nginx utilizza host / etc / hosts resolver
  • Una buona convenzione hostname per pochi server con molti servizi diversi?
  • Come fare Vernice ignorare, non eliminare i cookie
  • Apache / Vernice / PHP: solo per confermare, è ansible aggiornare automaticamente $ _SERVER per avere l'IP del client reale?
  • Esempi di 302 vs 303
  • row di riscrittura di nginx per redirect solo se un cookie non è impostato
  • La cosa importnte da notare è che la variabile chiave non influenza il contenuto della risposta. Viene utilizzato per il monitoraggio interno delle richieste in modo da poter identificare persone che eseguono richieste lente o altrimenti indesiderate.

    In Vernice, abbiamo un VCL come questo:

     if (req.http.host ~ "the-site-in-question.com") { if (req.url ~ "^/api/.+\.xml") { unset req.http.cookie; } } 

    Basta estrarre i cookie e lasciare che il backend faccia il resto per quanto riguarda i tempi (questo è un hackaround dato che Rails / authlogic invia cookie di session con risposte API).

    Attualmente tuttavia, tutti gli sviluppatori distinti stanno praticamente colpire le cache diverse dal momento che &key=SOMEALPHANUM è considerato come parte del hash vernice per lo stoccaggio. Questo non è ovviamente una grande soluzione e sto cercando di spiegare come dire Varnish ignorare quella parte dell'URI.

    3 Solutions collect form web for “Ignorare i parametri GET in vernice VCL”

    Se wherete lasciare intatta la key=SOMEALPHANUM nel backend nel caso in cui non sia stata consegnata dalla cache, allora potrebbe essere meglio regsub all'interno della function vcl_hash , in quanto questo non altererà veramente l'url ma invece modifica solo l'hash di il tasto.

     sub vcl_hash { if(req.http.host ~ "the-site-in-question.com" & req.url ~ "^/api/") { set req.http.X-Sanitized-URL = req.url; set req.http.X-Sanitized-URL = regsub(req.http.X-Sanitized-URL, "&key=[A-Za-z0-9]+", ""); set req.hash += req.http.X-Sanitized-URL; } else { set req.hash += req.url; } set req.hash += req.http.host; hash; } 

    in vcl_recv

    set req.url = regsub (req.url, "& key =. * $", "");

    Simile alla risposta di cd34, ma tenendo conto della possibilità di ordini diversi per i parametri di query e contando sul fatto che il problema definisce il valore come alfanumbersco:

     set req.url = regsub(req.url, "&key=[A-Za-z0-9]*", ""); 

    (Non posso commentare ancora, altrimenti questo sarebbe un commento alla risposta di cd34)

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.