2009-12-29 6 views
82

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

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

Jetzt bin ich nicht sicher, ob der Implikation: header ('Vary: Accept'); ich bin nicht wirklich sicher, was Vary: Accept 'wird genau tun ...

Die einzige Erklärung, die ich ist gefunden:

Nach dem Content-Type-Header wird Vary ein Header gesendet zu (wenn ich es richtig verstehe) erzählen Zwischenzwischenspeicher, wie Proxyserver, dass der Inhalt Art des Dokuments abhängig auf den Fähigkeiten des Klienten , der das Dokument anfordert. http://www.456bereastreet.com/archive/200408/content_negotiation/

Wer kann mir gibt eine "echte" Erklärung dieser Header (mit diesem Wert). Ich glaube, ich verstehe Dinge wie: Vary: Accept-Encoding wo der Cache auf Proxies auf der Codierung der Seite basieren könnte serviert, aber ich verstehe nicht: Vary: Accept

+1

Ehrlich gesagt - nicht die Mühe, . Abgesehen von den Fehlern in der Implementierung auf dieser Site ist die einzige Zeit, die Sie Vorteile von der Bereitstellung mit einem XML-Inhaltstyp erhalten, wenn Sie Dinge tun, die nicht in Text/HTML getan werden können - und wenn Sie alles tun Ändert den Doctype und xmlns, dann werden Sie diese Dinge nicht tun. Bleiben Sie bei Text/HTML. Sie können sich auch an HTML 4.01 halten. – Quentin

+0

Ja, ich verstehe das und ich denke "Probleme" wie diese entstehen viel zu oft in der Web-Entwicklung. Dank "sollte" in Spezifikationen/RFCs! – AlexV

+2

Sie sollten dies wahrscheinlich lesen: http://blogs.msdn.com/ieinternals/archive/2009/06/17/Vary-Header-Prevents-Caching-in-IE.aspx, bevor Sie VARY in Betracht ziehen. – EricLaw

Antwort

85
  • Die cache-control header ist der Hauptmechanismus für einen HTTP-Server, um einem Caching-Proxy die "Frische" einer Antwort mitzuteilen. (Das heißt, wie/wenn die Reaktion lange im Cache speichern)

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

Vary ist ausschließlich für jene Fälle, wo es aussichtslos oder zu kompliziert für ein Proxy, um zu replizieren, was der Server tun würde.

Ein konstruiertes 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 schon einmal dort war. Sie unterscheiden zwischen Anfragen und der "Besuchsanzahl" eines Nutzers basierend auf Cookies.Aber - Da die Zielseite Ihres Servers so groß ist, möchten Sie, dass Zwischenmitteilungen die Antwort zwischenspeichern, wenn möglich.

Die URL, Last-Modified und Cache-Control-Header sind unzureichend diese Einsicht zu einem Caching-Proxy zu geben, aber wenn Sie Vary: Cookie hinzufügen, wird die Cache-Maschine der Cookie-Header in seine Caching Entscheidungen hinzuzufügen.

Schließlich, für kleine Verkehr, dynamische Websites - Ich habe immer die einfache Cache-Control: no-cache, no-store und Pragma: no-cache ausreichend gefunden.

Edit - um Ihre Frage genauer zu beantworten: Der HTTP-Request-Header 'Accept' definiert die Content-Typen, die ein Client verarbeiten kann. Wenn Sie zwei Kopien desselben Inhalts unter derselben URL haben, die sich nur in Content-Type unterscheiden, kann die Verwendung von Vary: Accept angemessen sein.

-Update 11. September 12:

Ich bin auch ein paar Links, die in den Kommentaren erschienen sind, da dieser Kommentar ursprünglich geschrieben wurde. Sie sind beide hervorragende Ressourcen für reale Beispiele (und Probleme) mit Vary: Accept; Wenn Sie diese Antwort lesen, müssen Sie auch diese Links lesen.

Die erste, von der hervorragenden EricLaw, über das Verhalten des Internet Explorer mit dem Vary-Header und einige der Herausforderungen, die es an Entwickler stellt: Vary Header Prevents Caching in IE. Kurz gesagt, der IE (pre IE9) speichert keinen Inhalt, der den Vary-Header verwendet, weil der Request-Cache keine HTTP-Request-Header enthält. Eric Law (Eric Lawrence in der realen Welt) ist Programm-Manager im IE-Team.

Die zweite stammt von Eran Medan und ist eine fortlaufende Diskussion über unerwartetes Verhalten bei Vary in Chrome: Backing doesn't handle Vary header correctly. Es hängt mit dem Verhalten von IE zusammen, mit der Ausnahme, dass die Chrome-Entwickler einen anderen Ansatz gewählt haben - obwohl dies offenbar keine bewusste Entscheidung war.

+3

Vorsicht in Verbindung mit der Zurück-Browser-Taste in Chrome, es gibt eine Art Flammenkrieg auf diesen Fehler (der aus irgendeinem Grund nicht mehr funktioniert) http://code.google.com/p/chromium/issues/detail? id = 94369 –

+5

@EranMedan Der Chrome Bug wurde behoben. –

54

Vary: Accept sagt einfach, dass die Antwort auf der Accept Header in der Anfrage generiert wurde. Eine Anfrage mit einem anderen Accept Header könnte eine andere Antwort bekommen. (Sehen Sie, dass der verknüpfte PHP-Code auf $HTTP_ACCEPT aussieht. Das ist der Wert der Accept Request-Header.)

Um HTTP-Caches, bedeutet dies, dass die Antwort mit besonderer Sorgfalt im Cache gespeichert werden muß. Es wird nur eine gültige Übereinstimmung für spätere Anfragen sein mit genau der gleichen Accept Header.

Jetzt ist das nur wichtig, wenn die Seite überhaupt cachefähig ist. Standardmäßig sind PHP-Seiten nicht. Eine PHP-Seite kann die Ausgabe als cachefähig markieren, indem sie bestimmte Header sendet (zB Expires). Aber ob und wie das zu tun ist, ist eine andere Frage.

+0

ist es "könnte" oder ist es "sollte bekommen"? – Pacerier

+6

@Pacerier "vielleicht bekommen" ist richtig. "Variieren: Akzeptieren" bedeutet nicht, dass jeder einzelne unterschiedliche "Accept" -Headerwert eine andere und einzigartige Antwort erzeugt. Es bedeutet nur, dass ein anderer "Accept" -Header * eine andere Antwort erzeugen könnte. –

2

Es gibt tatsächlich eine erhebliche Anzahl neuer Funktionen, die bald (und schon in Chrome) verfügbar sind, die den Header Vary äußerst nützlich machen. Betrachten Sie beispielsweise Client Hinting.Wenn im Zusammenhang mit Bildern verwendet, zum Beispiel ermöglicht Client-Hinting eine Server-Ressourcen zu optimieren, wie Bilder in Abhängigkeit von:

  • Bildbreite
  • Ansichtsfenster Breite
  • Art der Codierung durch Browser unterstützt (man denke WebP)
  • Downlink (im wesentlichen Netzwerkgeschwindigkeit)

So ein Server, der die Vary Header würde setzen diese Funktionen unterstützt, das zeigen.

Chrome wirbt für die WebP-Unterstützung, indem "image/webp" als Teil des Headers Vary für jede Anforderung festgelegt wird. Ein Server könnte also ein Bild als WebP umschreiben, wenn der Browser dies unterstützt. Daher müsste der Proxy den Header überprüfen, um ein WebP-Bild nicht zwischenzuspeichern und dann an einen Browser zu liefern, der WebP nicht unterstützt. Offensichtlich, wenn Ihr Server das nicht tut, ist das egal. So, da Antwort des Servers auf dem Kopf Accept Anforderung variiert, muss die Antwort enthält, dass, um nicht-Proxies zu verwechseln:

Vary: Accept 

Ein weiteres Beispiel könnte die Bildbreite sein. In einem mobilen Browser kann die Width Kopfzeile für ein reaktionsfähiges Bild im Vergleich zu dem, was von einem Desktop-Browser angezeigt wird, ziemlich klein sein. Also in diesem Fall Width würde hinzugefügt werden, die Vary Header ist unerlässlich für Proxy, um die kleine mobile Version nicht zu cachen und es zu Desktop-Browsern dienen, oder umgekehrt. In diesem Fall könnte der Header:

Vary: Accept, Width 

Oder in dem Fall, dass ein Server all Client-Hinting-Spezifikationen unterstützt, würde der Kopf etwas wie:

Vary: Accept, DPR, Width, Save-Data, Downlink 
Verwandte Themen