¿Cuál es la función del encabezado HTTP “Vary: Accept”?

Uso PHP para generar páginas web dinámicas. Como se indica en el siguiente tutorial (ver enlace a continuación), el tipo MIME de documentos XHTML debe ser “application / xhtml + xml” cuando $ _SERVER [‘HTTP_ACCEPT’] lo permite. Como puede servir la misma página con 2 MIME diferentes (“application / xhtml + xml” y “text / html”), debe configurar el encabezado HTTP “Vary” en “Accept”. Esto ayudará a la memoria caché en los proxies.

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

Ahora no estoy seguro de la implicación de: header (‘Vary: Accept’); No estoy muy seguro de qué va a hacer ‘Vary: Accept’ …

La única explicación que encontré es:

Después del encabezado Content-Type, se envía un encabezado Vary a (si lo entiendo correctamente) indique los cachés intermedios, como los servidores proxy, que el tipo de contenido del documento varía según las capacidades del cliente que solicita el documento. http://www.456bereastreet.com/archive/200408/content_negotiation/

Cualquiera me puede dar una explicación “real” de este encabezado ( con ese valor ). Creo que entiendo cosas como: Variar: Aceptar-Codificar donde la caché de los proxies podría basarse en la encoding de la página servida, pero no entiendo: Variar: Aceptar

  • El encabezado de cache-control es el mecanismo principal para que un servidor HTTP le indique a un proxy de almacenamiento en caché la “frescura” de una respuesta. (es decir, cómo / si es largo para almacenar la respuesta en el caché)

  • En algunas situaciones, cache-control directivas de cache-control son insuficientes. Aquí se archiva una discusión del grupo de trabajo HTTP , que describe una página que solo cambia con el idioma. Este no es el caso de uso correcto para el encabezado vary, pero el contexto es valioso para nuestra discusión. (Aunque creo que el encabezado Vary resolvería el problema en ese caso, hay una Mejor forma). Desde esa página:

Vary es estrictamente para aquellos casos donde es imposible o excesivamente complicado para un proxy replicar lo que haría el servidor.

  • RFC2616 “Definiciones de campo de encabezado” describe el uso de encabezado desde la perspectiva del servidor, RFC2616 “Respuestas de caché negociado” desde una perspectiva de proxy de almacenamiento en caché. Su objective es especificar un conjunto de encabezados de solicitud HTTP que determinan la singularidad de una solicitud.

Un ejemplo artificial:

Su servidor HTTP tiene una página de aterrizaje grande. Tienes dos páginas ligeramente diferentes con la misma URL, dependiendo de si el usuario ha estado allí antes. Usted distingue entre las solicitudes y el “conteo de visitas” de un usuario basado en Cookies. Pero, dado que la página de destino de su servidor es tan grande, desea que los proxies intermediarios guarden en caché la respuesta si es posible.

Los encabezados URL, Last-Modified y Cache-Control son insuficientes para proporcionar esta información a un proxy de almacenamiento en caché, pero si agrega Vary: Cookie , el motor de caché agregará el encabezado Cookie a sus decisiones de almacenamiento en caché.

Finalmente, para tráfico pequeño, sitios web dynamics: siempre he encontrado el Cache-Control: no-cache, no-store simple Cache-Control: no-cache, no-store y Pragma: no-cache suficiente.

Editar: para responder con mayor precisión a su pregunta: el encabezado de solicitud HTTP ‘Aceptar’ define los tipos de contenido que un cliente puede procesar. Si tiene dos copias del mismo contenido en la misma URL, que difieren solo en Content-Type, entonces usar Vary: Accept podría ser apropiado.

Actualización 11 de septiembre 12:

Incluyo un par de enlaces que han aparecido en los comentarios desde que este comentario fue publicado originalmente. Ambos son recursos excelentes para ejemplos del mundo real (y problemas) con Vary: Accept; Si estás leyendo esta respuesta, debes leer esos enlaces también.

El primero, del destacado EricLaw, sobre el comportamiento de Internet Explorer con el encabezado Vary y algunos de los desafíos que presenta a los desarrolladores: Vary Header evita el almacenamiento en caché en IE . En resumen, IE (pre IE9) no almacena en caché ningún contenido que use el encabezado Vary porque el caché de solicitudes no incluye los encabezados de solicitud HTTP. EricLaw (Eric Lawrence en el mundo real) es un administrador de progtwig en el equipo de IE.

El segundo es de Eran Medan, y es una discusión en curso sobre el comportamiento inesperado relacionado con Vary en Chrome: el respaldo no maneja el encabezado Vary correctamente . Está relacionado con el comportamiento de IE, excepto que los desarrolladores de Chrome adoptaron un enfoque diferente, aunque no parece haber sido una elección deliberada.

Vary: Accept simplemente dice que la respuesta se generó en función del encabezado Accept en la solicitud. Una solicitud con un encabezado Accept diferente puede obtener una respuesta diferente.

(Puede ver que el código PHP vinculado mira $HTTP_ACCEPT . Ese es el valor del encabezado de solicitud Accept ).

Para cachés HTTP, esto significa que la respuesta debe almacenarse en caché con especial cuidado. Solo va a ser una coincidencia válida para solicitudes posteriores con exactamente el mismo encabezado Accept .

Ahora esto solo importa si la página es almacenable en caché en primer lugar. Por defecto, las páginas PHP no lo son. Una página PHP puede marcar el resultado como almacenable en caché al enviar ciertos encabezados ( Expires , por ejemplo). Pero si y cómo hacer eso es una pregunta diferente.

De hecho, hay una cantidad importante de nuevas características (y ya en Chrome) que hacen que el encabezado Vary extremadamente útil. Por ejemplo, considere Client Hinting . Cuando se usa en conexión con imágenes, por ejemplo, la sugerencia del cliente permite a un servidor optimizar recursos tales como imágenes en función de:

  • ancho de la imagen
  • Ancho de la vista
  • Tipo de encoding compatible con el navegador (piense en WebP)
  • Enlace descendente (esencialmente velocidad de red)

Por lo tanto, un servidor que admita esas características establecería el encabezado Vary para indicar eso.

Chrome anuncia la compatibilidad con WebP estableciendo “image / webp” como parte del encabezado Vary para cada solicitud. Por lo tanto, un servidor podría reescribir una imagen como WebP si el navegador lo admite, por lo que el proxy debería verificar el encabezado para no almacenar en caché una imagen WebP y luego enviarla a un navegador que no sea compatible con WebP. Obviamente, si su servidor no hace eso, no importaría. Entonces, como la respuesta del servidor varía en el encabezado de la solicitud de Accept , la respuesta debe incluir eso para no confundir los proxies:

 Vary: Accept 

Otro ejemplo podría ser el ancho de la imagen. En un navegador móvil, el encabezado Width podría ser bastante pequeño para una imagen receptiva, en comparación con lo que sería si se viera desde un navegador de escritorio. Entonces, en ese caso, el Width se agregaría al encabezado Vary Es esencial que el proxy no almacene en caché la versión móvil pequeña y la envíe a los navegadores de escritorio, o viceversa. En ese caso, el encabezado podría incluir:

 Vary: Accept, Width 

O en el caso de que un servidor sea compatible con todas las especificaciones de sugerencias del cliente, el encabezado sería algo así como:

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

Este video de google webmaster tiene una muy buena explicación sobre el encabezado de HTTP Vary .