90 votes

Essayer de comprendre l'en-tête HTTP "Vary"

J'utilise le PHP pour générer des pages Web dynamiques. Comme indiqué sur le tutoriel suivant (voir le lien ci-dessous), le type MIME de documents XHTML doit être "application/xhtml+xml" lorsque la variable $_SERVER['HTTP_ACCEPT'] permet. Puisque vous pouvez servir la même page avec 2 différents MIMEs ("application/xhtml+xml" et "text/html"), vous devez définir le "Varier" en-tête HTTP "Accept". Cela aidera le cache sur les procurations.

Lien: http://keystonewebsites.com/articles/mime%5Ftype.php

Maintenant, je ne suis pas sûr de l'implication de: header('Vary: Accept'); Je ne suis pas vraiment sûr de ce que "Vary: Accept' va justement faire...

La seule explication que j'ai trouvé est:

Après le header Content-Type, une Varier l'en-tête est envoyée à (si je comprends bien correctement) dire caches intermédiaires, comme les serveurs proxy, que le contenu type de document varie selon les capacités du client qui demande le document. http://www.456bereastreet.com/archive/200408/content%5Fnegotiation/

Quelqu'un peut me donner un "vrai" explication de cette en-tête (avec la valeur). Je crois que je comprends des choses comme: Vary: Accept-Encoding lorsque le cache sur les procurations pourrait être basé sur le codage de la page, mais je ne comprends pas: Vary: Accept

Tout HTTP gourou peut vous aider?

Merci!

94voto

J.J. Points 2676
  • L' cache-control - tête est le principal mécanisme pour un serveur HTTP à dire un proxy cache la "fraîcheur" d'une réponse. (c'est à dire, comment/si long pour stocker la réponse dans le cache)

  • Dans certaines situations, cache-control directives sont insuffisantes. Une discussion à partir de l'adresse HTTP du groupe de travail est archivé ici, description d'une page qui ne change que par le langage. C'est pas le bon cas d'utilisation de l'en-tête vary, mais le contexte est précieux pour notre discussion. (Bien que je crois que l'en-tête Vary permettrait de résoudre le problème dans ce cas, il ya une Meilleure Façon.) À partir de cette page:

Vary est strictement pour les cas où il est impossible ou excessivement compliqué pour un proxy de reproduire ce que le serveur allait faire.

  • Cette page décrit l'en-tête d'utilisation du serveur de point de vue, cela l'une à partir d'un proxy cache point de vue. Il est destiné à spécifier un ensemble d'en-têtes de requête HTTP que déterminer l'unicité d'une demande.

Un exemple artificiel:

Votre serveur HTTP a une grande page de destination. Vous avez deux légèrement différentes pages avec la même URL, selon si l'utilisateur a été là avant. Vous faites une distinction entre les demandes et un utilisateur "nombre de visites" basé sur des Cookies. Mais, depuis votre serveur de la page de destination est si grand, que vous souhaitez intermédiaire des procurations pour mettre en cache la réponse si possible.

L'URL, de Dernière modification et de Contrôle du Cache-têtes sont insuffisantes pour donner cette idée à un proxy cache, mais si vous ajoutez Vary: Cookie, le moteur de cache va ajouter l'en-tête de Cookie à la mise en cache des décisions.

Enfin, pour les petits trafics, des sites web dynamiques -- j'ai toujours trouvé le simple Cache-Control: no-cache, no-store et Pragma: no-cache suffisant.

Edit -- pour plus de répondre précisément à votre question: la tête de requête HTTP "Accepter" définit le Contenu-Type d'un client peut traiter. Si vous avez deux copies de la même contenu à la même URL, ne différant que par le Type de Contenu, puis à l'aide de Vary: Accept pourrait être approprié.

Mise À Jour 11 Sep 12:

Je suis, y compris un couple de liens qui ont paru dans les commentaires, car ce commentaire a été posté. Ils sont tous les deux d'excellentes ressources pour les exemples du monde réel (et les problèmes) avec Vary: Accept; I si vous êtes à la lecture de cette réponse dont vous avez besoin pour lire ces liens.

La première, de la circulation EricLaw, sur Internet Explorer comportement avec l'en-tête Vary et certains des défis qu'il présente pour les développeurs: l'en-Tête Vary Empêche la mise en Cache de IE. En bref, c'est à dire (pré IE9) ne cache pas tout le contenu qui utilise l'en-tête Vary, car la demande de cache ne comprend pas-têtes de Requête HTTP. EricLaw (Eric Laurent dans le monde réel) est un chef de Programme de l'IE de l'équipe.

La seconde est de Eran Medan, et la discussion de Varier liées à un comportement inattendu dans google Chrome: la Sauvegarde ne gère pas Varier en-tête correctement. C'est lié à IE comportement, à l'exception du Chrome devs ont pris une approche différente, même s'il ne semble pas avoir été un choix délibéré.

56voto

Jason Orendorff Points 15869

Vary: Accept dit simplement que la réponse a été généré sur la base de l' Accept - tête de la demande. Une demande différente Accept - tête peut obtenir une réponse différente.

(Vous pouvez voir que le lié du code PHP regarde $HTTP_ACCEPT. C'est la valeur de l' Accept - tête de la requête.)

HTTP caches, cela signifie que la réponse doit être mis en cache avec le plus grand soin. Il est uniquement destiné à être une correspondance valide pour les demandes ultérieures avec exactement le même Accept - tête.

Maintenant, cela n'a aucun sens si la page est mis en cache dans la première place. Par défaut, les pages PHP ne le sont pas. Une page PHP peut marquer la sortie comme pouvant être mis en cache par l'envoi de certains en-têtes (Expires, par exemple). Mais si, et comment faire c'est une autre question.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X