Pregunta ¿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.

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

Ahora no estoy seguro de la implicación de: encabezado ('Vary: aceptar'); No estoy muy seguro de qué va a hacer 'Vary: Accept' ...

La única explicación que encontré es:

Después del encabezado Content-Type, a Vary   el encabezado se envía a (si lo entiendo   correctamente) decir cachés intermedios,   como servidores proxy, que el contenido   tipo de documento varía dependiendo   en 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 codificación de la página servida, pero no entiendo: Variar: aceptar


84
2017-12-29 16:15


origen


Respuestas:


  • los cache-control El encabezado 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 las directivas son insuficientes Una discusión del grupo de trabajo HTTP está archivada aquí, describiendo una página que solo cambia con el lenguaje. Esto es no el caso de uso correcto para el encabezado varía, 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.

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 el tráfico pequeño, sitios web dinámicos: siempre he encontrado lo simple Cache-Control: no-cache, no-storey 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 use 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: Variar el encabezado 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 programa 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.


89
2017-12-29 16:59



Vary: Accept simplemente dice que la respuesta se generó en base a la Accept encabezado en la solicitud. Una solicitud con un diferente Accept el encabezado puede obtener una respuesta diferente.

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

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 lo mismo Accept encabezamiento.

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.


55
2017-12-29 17:53



En realidad, hay una cantidad significativa de nuevas características próximamente (y ya en Chrome) que hacen que Vary encabezado extremadamente útil. Por ejemplo, considere Sugerencia del cliente. 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 codificación compatible con el navegador (piense en WebP)
  • Enlace descendente (esencialmente velocidad de red)

Entonces, un servidor que soporte esas características establecería Vary encabezado para indicar eso.

Chrome anuncia el soporte de WebP al configurar "image / webp" como parte del Vary encabezado 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, dado que la respuesta del servidor varía en el AcceptEncabezado de solicitud, la respuesta debe incluir eso para no confundir proxies:

Vary: Accept

Otro ejemplo podría ser el ancho de la imagen. En un navegador móvil el Width el encabezado puede 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 Width se agregaría a la Vary el encabezado es esencial para 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

2
2017-09-09 20:59



Esta google webmaster video tiene una muy buena explicación sobre HTTP Vary encabezamiento.


1
2018-01-31 07:30