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
Vary:
Header.Antworten:
Der
cache-control
Header 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-control
Richtlinien 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: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-store
undPragma: no-cache
Ausreichende 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: Accept
angemessen 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.
quelle
Vary: Accept
sagt einfach, dass die Antwort basierend auf demAccept
Header in der Anfrage generiert wurde . Eine Anfrage mit einem anderenAccept
Header 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 desAccept
Anforderungsheaders.)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
Accept
Header 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 (
Expires
z. B.) als zwischenspeicherbar markieren . Aber ob und wie das geht, ist eine andere Frage.quelle
Vary: Accept
bedeutet nicht, dass jeder einzelne mögliche unterschiedlicheAccept
Header-Wert eine andere und eindeutige Antwort erzeugt. Dies bedeutet nur, dass ein andererAccept
Header möglicherweise eine andere Antwort erzeugt.Dieses Google Webmaster-Video enthält eine sehr gute Erklärung zum HTTP-
Vary
Header.quelle
Es gibt tatsächlich eine beträchtliche Anzahl neuer Funktionen in Kürze (und bereits in Chrome), die den
Vary
Header ä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:Ein Server, der diese Funktionen unterstützt, würde den
Vary
Header so einstellen , dass dies angezeigt wird.Chrome bewirbt die WebP-Unterstützung, indem "image / webp" als Teil des
Vary
Headers 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 imAccept
Anforderungsheader variiert , muss die Antwort Folgendes enthalten, um Proxys nicht zu verwirren:Ein anderes Beispiel könnte die Bildbreite sein. In einem mobilen Browser ist der
Width
Header 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 wirdWidth
derVary
Header 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:In dem Fall, dass ein Server alle Client-Hinweisspezifikationen unterstützt, lautet der Header wie folgt:
quelle