/ / Codeigniter: Lack und Cookie / Session Konflikt - PHP, Session, Caching, Lack

Codeigniter: Lack- und Cookie- / Sitzungskonflikt - PHP, Sitzung, Zwischenspeicherung, Lack

Ich habe eine Website, die von Sitzung und Cookie abhängig ist. Ich möchte den Varnish-Cache darauf implementieren lassen.

  1. Wenn der Browser geöffnet ist, hat die Website dieselbe Sitzungs-ID, bis der Browser geschlossen wird. Aber die ALTER Wert im Header bleibt erhalten 0 . Dieser AGE-Wert beschreibt, ob Lack die Seite zwischenspeichert oder nicht. 0 bedeutet, dass es nicht zwischengespeichert wird.

  2. So überprüfen Sie, ob das Lack-Caching funktioniert oder nicht: curl -I domainname Ist der Befehl, drücke ich diesen durch Terminal, Der Header gibt verschiedene PHPSESSIONID Bei jedem HIT bleibt auch der Wert von AGE 0.

Kann nicht genau feststellen, was nicht zulässt, dass die Site von Varnish zwischengespeichert wird.

Nur um mich zu testen commented the session_start(), und hier sind die folgenden Beobachtungen. Im Browser

  1. Das Sitzungs-ID-Cookie wurde nicht im Browser erstellt.
  2. Das ALTER blieb für mehrere Treffer auf derselben Seite immer noch 0.

Am Terminal

  1. Die PHP-Session-ID wurde in der Header-Antwort nicht angezeigt.
  2. Der Alterswert war 0 beim ersten Treffer, aber bei späteren Treffern erhielt er weiterhin einen inkrementellen numerischen Wert.

Es scheint, dass Varnish bei Browsertreffern nicht zwischengespeichert werden kann. Besonders wenn Domain angegeben ist.

Hilfe Wie funktioniert der Lackcache für sitzungsbasierte Websites?

Antworten:

0 für die Antwort № 1

Varnish speichert keine Seiten, auf denen Cookies standardmäßig gesetzt sind. Es gibt zwei Möglichkeiten, um dieses Problem zu umgehen:

  1. Entferne Cookies von der Seite. Dies funktioniert nur für Sie, wenn für die Seite überhaupt keine Sitzung erforderlich ist (d. H. Kein benutzerspezifischer Inhalt vorhanden ist). Sie können dies folgendermaßen tun:

    // ... default.vcl
    sub vcl_recv {
    unset req.http.Cookie;
    
    return(hash);
    }
    
  2. Fügen Sie den Cookie zu dem von Varnish generierten Hash hinzu,was dann bedeutet, dass jede Sitzung ihren eigenen individuellen Cache hat (es wird immer noch der Leistung zugute kommen, aber bei weitem nicht so stark, als ob Sie sich für Option 1 entscheiden könnten.

    // ... default.vcl
    sub vcl_hash {
    hash_data(req.url);
    
    if (req.http.host) {
    hash_data(req.http.host);
    } else {
    hash_data(server.ip);
    }
    
    hash_data(req.http.Cookie);
    
    return(lookup);
    }
    

Möglicherweise haben Sie einige Seiten, die anscheinend keine habenbenutzerspezifischer Inhalt an (zum Beispiel, wenn Sie ein Blog haben, Blog-Posts würden keinen benutzerspezifischen Inhalt benötigen), aber Sie haben möglicherweise etwas, das angibt, ob der Benutzer angemeldet ist oder nicht. Wenn Sie dies über AJAX zu einem Problem machen können Nicht zwischengespeicherter oder zwischengespeicherter Endpunkt pro Sitzung, dann funktioniert alles einwandfrei.

Bei Option 2 müssen Sie das Cookie möglicherweise vorübergehend in einer anderen Kopfzeile speichern, damit Varnish die Seite tatsächlich zwischenspeichert. Gehen Sie dazu folgendermaßen vor:

// ... default.vcl
sub vcl_recv {
set req.http.X-Cookie = req.http.Cookie;
unset req.http.Cookie;

return(hash);
}

Dann ändern Sie einfach die vcl_hash Funktion zu verwenden req.http.X-Cookie Anstatt von req.http.Cookie.