Welche Funktion hat der HTTP-Header "Vary: Accept"?

93

Ich benutze PHP, um dynamische Webseiten zu generieren. Wie im folgenden Tutorial angegeben (siehe Link unten), sollte der MIME-Typ von XHTML-Dokumenten "application / xhtml + xml" sein, wenn $ _SERVER ['HTTP_ACCEPT'] dies zulässt. Da Sie dieselbe Seite mit zwei verschiedenen MIMEs ("application / xhtml + xml" und "text / html") bereitstellen können, sollten Sie den HTTP-Header "Vary" auf "Accept" setzen. Dies hilft dem Cache auf Proxys.

Link: http://keystonewebsites.com/articles/mime_type.php

Jetzt bin ich mir nicht sicher, welche Auswirkungen Folgendes hat: header ('Vary: Accept'); Ich bin mir nicht sicher, was 'Vary: Accept' genau tun wird ...

Die einzige Erklärung, die ich gefunden habe, ist:

Nach dem Content-Type-Header wird ein Vary-Header gesendet, um (wenn ich es richtig verstehe) Zwischen-Caches wie Proxyservern mitzuteilen, dass der Inhaltstyp des Dokuments abhängig von den Funktionen des Clients variiert, der das Dokument anfordert. http://www.456bereastreet.com/archive/200408/content_negotiation/

Jeder kann mir eine "echte" Erklärung dieses Headers geben ( mit diesem Wert ). Ich glaube, ich verstehe Dinge wie: Variieren: Akzeptieren-Codierung, wobei der Cache auf Proxys auf der Codierung der bereitgestellten Seite basieren könnte, aber ich verstehe nicht: Variieren: Akzeptieren

AlexV
quelle
1
Ehrlich gesagt - mach dir keine Sorgen. Abgesehen von den Fehlern in der Implementierung auf dieser Site profitieren Sie nur dann von der Bereitstellung eines XML-Inhaltstyps, wenn Sie Dinge tun, die in Text / HTML nicht möglich sind - und wenn Sie alles tun Wenn Sie Doctype und xmlns ausschalten, werden Sie diese Dinge nicht tun. Bleib bei Text / HTML. In diesem Fall können Sie sich genauso gut an HTML 4.01 halten.
Quentin
Ja, ich verstehe das und ich denke, dass "Probleme" wie dieses viel zu oft in der Webentwicklung auftreten. Dank "sollte" in Spezifikationen / RFCs!
AlexV
2
Sie sollten dies wahrscheinlich lesen: blogs.msdn.com/ieinternals/archive/2009/06/17/…, bevor Sie VARY verwenden.
EricLaw
1
Dieses Video enthält eine gute Erklärung zum Vary:Header.
Kannan Mohan

Antworten:

94
  • Der cache-controlHeader ist der primäre Mechanismus für einen HTTP-Server, um einem Caching-Proxy die "Aktualität" einer Antwort mitzuteilen. (dh wie / ob lange, um die Antwort im Cache zu speichern)

  • In einigen Situationen sind cache-controlRichtlinien unzureichend. Hier wird eine Diskussion der HTTP-Arbeitsgruppe archiviert , die eine Seite beschreibt, die sich nur mit der Sprache ändert. Dies ist nicht der richtige Anwendungsfall für den variierenden Header, aber der Kontext ist für unsere Diskussion wertvoll. (Obwohl ich glaube, dass der Vary-Header das Problem in diesem Fall lösen würde, gibt es einen besseren Weg.) Von dieser Seite:

Vary Dies gilt ausschließlich für Fälle, in denen es für einen Proxy hoffnungslos oder übermäßig kompliziert ist, das zu replizieren, was der Server tun würde.

Ein erfundenes Beispiel:

Ihr HTTP-Server verfügt über eine große Zielseite. Sie haben zwei leicht unterschiedliche Seiten mit derselben URL, je nachdem, ob der Benutzer zuvor dort war. Sie unterscheiden zwischen Anfragen und der "Besuchsanzahl" eines Benutzers basierend auf Cookies. Da die Zielseite Ihres Servers jedoch so groß ist, möchten Sie, dass zwischengeschaltete Proxys die Antwort nach Möglichkeit zwischenspeichern.

Die URL-, Last-Modified- und Cache-Control-Header reichen nicht aus, um einem Caching-Proxy diesen Einblick zu gewähren. Wenn Sie jedoch hinzufügen Vary: Cookie, fügt die Cache-Engine den Cookie-Header zu ihren Caching-Entscheidungen hinzu.

Schließlich habe ich für kleine, dynamische Websites immer das Einfache Cache-Control: no-cache, no-storeund Pragma: no-cacheAusreichende gefunden.

Bearbeiten - um Ihre Frage genauer zu beantworten: Der HTTP-Anforderungsheader 'Akzeptieren' definiert die Inhaltstypen, die ein Client verarbeiten kann. Wenn Sie zwei Kopien desselben Inhalts unter derselben URL haben, die sich nur im Inhaltstyp unterscheiden, kann die Verwendung Vary: Acceptangemessen sein.

Update 11. September 12:

Ich füge ein paar Links hinzu, die in den Kommentaren erschienen sind, seit dieser Kommentar ursprünglich gepostet wurde. Sie sind beide hervorragende Ressourcen für Beispiele (und Probleme) aus der Praxis mit Vary: Accept; Wenn Sie diese Antwort lesen, müssen Sie auch diese Links lesen.

Das erste, von EricLaw, über das Verhalten von Internet Explorer mit dem Vary-Header und einige der Herausforderungen, die es Entwicklern stellt: Vary-Header verhindert das Caching im IE . Kurz gesagt, IE (vor IE9) speichert keine Inhalte zwischen, die den Vary-Header verwenden, da der Anforderungscache keine HTTP-Anforderungsheader enthält. EricLaw (Eric Lawrence in der realen Welt) ist Programmmanager im IE-Team.

Die zweite stammt von Eran Medan und ist eine laufende Diskussion über unerwartetes Verhalten im Zusammenhang mit Vary in Chrome: Backing behandelt Vary-Header nicht richtig . Es hängt mit dem Verhalten des IE zusammen, außer dass die Chrome-Entwickler einen anderen Ansatz gewählt haben - obwohl es keine bewusste Entscheidung zu sein scheint.

JJ
quelle
3
Beachten Sie, dass es in Verbindung mit der Schaltfläche "Zurück" des Browsers in Chrome eine Art Flammenkrieg um diesen Fehler gibt (der jetzt aus irgendeinem Grund nicht behoben wird
Eran Medan
6
@EranMedan Der Chrome-Fehler wurde inzwischen behoben.
59

Vary: Acceptsagt einfach, dass die Antwort basierend auf dem AcceptHeader in der Anfrage generiert wurde . Eine Anfrage mit einem anderen AcceptHeader erhält möglicherweise eine andere Antwort.

(Sie können sehen, dass der verknüpfte PHP-Code angezeigt wird $HTTP_ACCEPT. Dies ist der Wert des AcceptAnforderungsheaders.)

Für HTTP-Caches bedeutet dies, dass die Antwort mit besonderer Sorgfalt zwischengespeichert werden muss. Es wird nur eine gültige Übereinstimmung für spätere Anforderungen mit genau demselben AcceptHeader sein .

Dies ist nur dann von Bedeutung, wenn die Seite überhaupt zwischengespeichert werden kann. Standardmäßig sind PHP-Seiten nicht. Eine PHP-Seite kann die Ausgabe durch Senden bestimmter Header ( Expiresz. B.) als zwischenspeicherbar markieren . Aber ob und wie das geht, ist eine andere Frage.

Jason Orendorff
quelle
ist es "könnte bekommen" oder ist es "sollte bekommen"?
Pacerier
6
@ Pacerier "könnte bekommen" ist korrekt. Vary: Acceptbedeutet nicht, dass jeder einzelne mögliche unterschiedliche AcceptHeader-Wert eine andere und eindeutige Antwort erzeugt. Dies bedeutet nur, dass ein anderer AcceptHeader möglicherweise eine andere Antwort erzeugt.
Jason Orendorff
2

Es gibt tatsächlich eine beträchtliche Anzahl neuer Funktionen in Kürze (und bereits in Chrome), die den VaryHeader äußerst nützlich machen. Betrachten Sie beispielsweise Client Hinting . Bei Verwendung in Verbindung mit Bildern ermöglicht ein Client-Hinweis beispielsweise einem Server, Ressourcen wie Bilder zu optimieren, abhängig von:

  • Bild breite
  • Breite des Ansichtsfensters
  • Vom Browser unterstützte Codierungsart (siehe WebP)
  • Downlink (im Wesentlichen Netzwerkgeschwindigkeit)

Ein Server, der diese Funktionen unterstützt, würde den VaryHeader so einstellen , dass dies angezeigt wird.

Chrome bewirbt die WebP-Unterstützung, indem "image / webp" als Teil des VaryHeaders für jede Anforderung festgelegt wird. Ein Server könnte ein Image als WebP umschreiben, wenn der Browser dies unterstützt. Daher müsste der Proxy den Header überprüfen, um ein WebP-Image nicht zwischenzuspeichern, und es dann einem Browser bereitstellen, der WebP nicht unterstützt. Wenn Ihr Server dies nicht tut, spielt dies natürlich keine Rolle. Da die Antwort des Servers im AcceptAnforderungsheader variiert , muss die Antwort Folgendes enthalten, um Proxys nicht zu verwirren:

Vary: Accept

Ein anderes Beispiel könnte die Bildbreite sein. In einem mobilen Browser ist der WidthHeader für ein responsives Bild möglicherweise recht klein, verglichen mit dem, was es wäre, wenn es von einem Desktop-Browser aus betrachtet würde. In diesem Fall wird Widthder VaryHeader zum Header hinzugefügt, damit der Proxy die kleine mobile Version nicht zwischenspeichert und sie für Desktop-Browser bereitstellt oder umgekehrt. In diesem Fall kann der Header Folgendes enthalten:

Vary: Accept, Width

In dem Fall, dass ein Server alle Client-Hinweisspezifikationen unterstützt, lautet der Header wie folgt:

Vary: Accept, DPR, Width, Save-Data, Downlink
Brad Berger
quelle