2014-01-11 12 views

Antwort

3

Da X-UA-Device nicht auf der Client-Anfrage oder in irgendwelchen Downstream-Proxys verfügbar ist (es wird in Varnish generiert), müssen Sie auf die rohe Vary Kopfzeile variieren.

0

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-DeviceAntwort Header zugunsten von clientseitigen Skripte wurden Einstellung oder in der Hoffnung, dass es von Downstream-Caches erkannt würde.)

+0

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

+0

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) –

+0

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

Verwandte Themen