2009-12-29 23 views
82

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.¿Cuál es la función del encabezado HTTP "Vary: Accept"?

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

ahora no estoy seguro de la implicación de: cabecera ('Vary: Accept'); No estoy realmente seguro de lo que está Vary: Accept 'va a hacer precisamente ...

La única explicación que he encontrado es:

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

alguien me puede dar una explicación "real" de esta cabecera (con ese valor). Creo que entiendo cosas como: Vary: Accept-Encoding donde el caché de proxy podría estar basado en la codificación de la página servido, pero no entiendo: Vary: Accept

+1

Francamente - no se moleste . Dejando de lado las fallas en la implementación en ese sitio, la única vez que obtendrás beneficios de servir con un tipo de contenido XML es cuando haces cosas que no se pueden hacer en texto/html, y si todo lo que estás haciendo está desconectando el Doctype y xmlns, entonces no vas a hacer esas cosas. Quédate con el texto/html. Para el caso, también podría apegarse a HTML 4.01. – Quentin

+0

Sí, entiendo esto y creo que los "problemas" como este surgen con demasiada frecuencia en el desarrollo web. ¡Gracias a "debería" en las especificaciones/RFC! – AlexV

+2

Probablemente deberías leer esto: http://blogs.msdn.com/ieinternals/archive/2009/06/17/Vary-Header-Prevents-Caching-in-IE.aspx antes de considerar usar VARY. – EricLaw

Respuesta

85
  • El 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 tiempo de almacenar la respuesta en el caché)

  • En algunas situaciones, las directivas cache-control son insuficientes. Un debate del grupo de trabajo HTTP está archivado here, que describe una página que solo cambia con el idioma. Esto es no el caso de uso correcto para el encabezado vary, pero el contexto es valioso para nuestra discusión. (Aunque creo que la cabecera Vary resolvería el problema en ese caso, no hay una mejor manera.) A partir de esa página:

Vary es estrictamente para aquellos casos en los que no hay esperanza o excesivamente complicado para un proxy para replicar lo que haría el servidor.

Un ejemplo artificioso:

Su servidor HTTP tiene una página de aterrizaje de gran tamaño. 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 dinámicos: siempre he encontrado que el simple Cache-Control: no-cache, no-store y el Pragma: no-cache son suficientes.

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 podría ser apropiado usar Vary: Accept.

Actualización 11 12 de septiembre:

Estoy incluyendo un par de enlaces que han aparecido en los comentarios ya que este comentario fue originalmente publicado. 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 Prevents Caching in 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: Backing doesn't handle Vary header correctly. 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.

+3

Tenga cuidado con esto junto con el botón de navegador en Chrome, hay una especie de guerra de llama en este error (que ahora es un error por algún motivo) http://code.google.com/p/chromium/issues/detail? id = 94369 –

+5

@EranMedan El error de Chrome se ha solucionado desde entonces. –

54

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.

(Se puede ver que el código PHP ligado mira $HTTP_ACCEPT. Ese es el valor de la cabecera Accept petición.)

Para cachés HTTP, esto significa que la respuesta debe ser almacenado en caché con un cuidado especial. 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é enviando ciertos encabezados (Expires, por ejemplo). Pero si y cómo hacer eso es una pregunta diferente.

+0

¿es "posible" o "debería obtenerse"? – Pacerier

+6

@Pacerier "might get" es correcto. 'Vary: Accept' no significa que cada uno de los posibles valores distintivos del encabezado' Accept' produce una respuesta diferente y única. Solo significa que un encabezado 'Aceptar' diferente * podría * producir una respuesta diferente. –

2

En este momento hay una cantidad significativa de nuevas características (y ya en Chrome) que hacen que el encabezado Vary sea extremadamente útil. Por ejemplo, considere Client Hinting.Cuando se utiliza en relación con las imágenes, por ejemplo, dando a entender cliente permite a un servidor para optimizar los recursos, tales como imágenes en función de:

  • Anchura de imagen
  • ventana gráfica Ancho
  • tipo de codificación soportado por el navegador (piensa WebP)
  • enlace descendente (esencialmente la velocidad de red)

Así que un servidor que soporte estas características sería establecer la cabecera Vary para indicar que.

Chrome anuncia la compatibilidad con WebP configurando "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. Así que ya que la respuesta del servidor varía en la cabecera Accept petición, la respuesta debe incluir que a fin de no confundir los proxies:

Vary: Accept 

Otro ejemplo podría ser ancho de la imagen. En un navegador móvil, el encabezado Width 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, se agregaría Width al encabezado Vary, que 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, la cabecera podría incluir:

Vary: Accept, Width 

O en el caso de que un servidor admite toda del cliente insinuando especificaciones, la cabecera sería algo así como:

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