2017-02-24 3 views
0

Neu bei Varnish. . Es ist immer schwer, mehr als erwartet :-(Varnish Caching mit Keksen

Ich versuche, einige PHP-Code zu verbessern, vor einiger Zeit entwickelt, Lack mit Dieser Code verwendet nur zwei Cookies: PHPSESSID und SPRACHE

Alle Seiten gesetzt . PHPSESSID-Cookie, wenn es nicht definiert ist jedoch dieses Cookie für anonyme Sitzungen ist es nur auf einer Seite verwendet

Lassen sie uns sagen, ich habe Seiten 1, 2, Page3 und Page4 Meine Konfiguration sollte wie folgt lauten:..

Seiten 1, 2 und Seite3 benötigen LANGUAGE Cookie und sollten mit diesem Cookie zwischengespeichert werden: ein Cache fo r jede Sprache und Seite.

Page4 benötigt Cookies von PHPSESSID und LANGUAGE und sollte nicht im Cache gespeichert werden, wie es für jeden Benutzer spezifisch ist.

Meine default.vlc funktioniert nicht richtig, so würde jede Ausrichtung wirklich geschätzt werden. Vielleicht habe ich einige Konzepte missverstanden.

sub vcl_init { 

    # When requests come to Varnish I need to remove PHPSESSID so it's not used for the hash in caching. Page4 doesn't need caching as it's specific for each user: 
     if (req.http.host ~ "Page4") { 
     return(pass); 
     } 

    # remove PHPSESSID so pages1, 2, and 3 get cached just once for everyuser but in all languages. 

     if ((req.url !~ "page4")) { 
      set req.http.Cookie = regsuball(req.http.Cookie, "PHPSESSID=[^;]+(;)?", ""); 
     } 

    return (hash); 


    } 

Ich brauche Webseiten mit SPRACH Cookie zwischenzuspeichern, so schließe ich es in vcl_hash:

sub vcl_hash { 
    hash_data(req.url); 
    if (req.http.host) { 
    hash_data(req.http.host); 
    } else { 
    hash_data(server.ip); 
    } 

    # hash cookies for requests that have them 
    if (req.http.Cookie) { 
    hash_data(req.http.Cookie); 
    } 
} 

Wie kann ich nur PHPSESSIONID entfernen?

sub vcl_backend_response { 
    # Called after the response headers has been successfully retrieved from the backend. 

    if (!(bereq.url ~ "Page4")) { 
    unset beresp.http.set-cookie; 
    } 
    return (deliver); 

} 

Antwort

1

Sie sind auf dem richtigen Weg. Wenn ich Ihre Frage verstehe, ist die Sache, die nicht funktioniert, dass Sie alle Cookies Server-Antwort entfernen (wenn es nicht Seite4 ist), anstatt nur PHPSESSID zu entfernen.

Sie können eine Regexp in Ihrem sub vcl_backend_response durchführen, um nur phsphesessionid zu entfernen, wenn URL nicht Page4 ist.

beresp.http.set-cookie = regsuball(beresp.http.set-cookie, "PHPSESSID=[^;]+(;)?", "") 

Alternativ, wenn Sie Lack 4 oder höher verwenden, sollten Sie die VMOD Cookie verwenden, die Cookie Handhabung viel einfacher (keine Notwendigkeit mehr für regexp) macht.