Obwohl auf X-UA-Device
Variation für Downstream-Caches falsch ist, Lack selbst noch von dieser Optimierung profitieren kann, wenn Sie den Header in vcl_deliver
Vary umschreiben:
sub vcl_deliver {
if (resp.http.Vary) {
set resp.http.Vary = regsub(resp.http.Vary,
"(?i)X-UA-Device",
"User-Agent");
}
}
diese Weise variiert Varnish seinen Cache auf X-UA-Device
und Downstream-Caches variieren auf User-Agent
.
In Ihrer Frage haben Sie erwähnt, dass Sie X-UA-Device
zu der Antwort Header sowie der Anfrage-Header hinzugefügt haben. In diesem Fall wird der obige Vorschlag nicht funktionieren und Sie werden stattdessen Vary: User-Agent
müssen bedingungslos senden:
sub vcl_fetch {
set beresp.http.X-UA-Device = req.http.X-UA-Device;
if (!beresp.http.Vary) {
set beresp.http.Vary = "User-Agent";
} elsif (beresp.http.Vary !~ "(?i)User-Agent") {
set beresp.http.Vary = beresp.http.Vary + ", User-Agent";
}
}
(ich war nicht sicher, ob Sie die X-UA-Device
Antwort Header zugunsten von clientseitigen Skripte wurden Einstellung oder in der Hoffnung, dass es von Downstream-Caches erkannt würde.)
Ich denke, das ist falsch, da 'vcl_deliver' aufgerufen wird, nachdem Varnish selbst das Objekt im Cache gespeichert hat. Wenn Sie verschiedene Versionen derselben URL zwischenspeichern möchten, sollten Sie 'vcl_hash' verwenden. – NITEMAN
Die Idee ist, dass die Anwendung 'Vary: X-UA-Device' im Antwort-Header sendet. Varnish speichert diese Version des 'Vary'-Headers und trifft seine Hit/Miss-Entscheidungen basierend auf dieser Version. (Varnish _does_ huldigt den Vary-Header, so dass keine zusätzliche "vcl_hash" -Logik erforderlich ist.) Das Umschreiben des Antwortheaders auf "Vary: User-Agent" in "vcl_deliver" stellt sicher, dass sich alle nachfolgenden Caches korrekt verhalten. (Hinweis: Ich habe dies getestet und bestätigt, dass es mit Varnish 3.0.5 funktioniert) –
Das ist korrekt, wenn die Geräteerkennung außerhalb von Varnish (in der Anwendung) ausgeführt wird, wenn Sie die Erkennung innerhalb von Lack durchführen (wie in der ursprünglichen Frage) achte auf den Vary-Header auf 'vcl_deliver' mit etwas wie:' if (resp .http.Vary) {set resp.http.Vary = resp .http.Vary + ", User-Agent"; } else {set resp.http.Vary = "Benutzer-Agent"; } ' – NITEMAN