2012-10-11 35 views
5

Tengo un servidor web que proporciona un ETag para una URL en particular. Cuando el navegador realiza una solicitud para esta url, proporciona el encabezado http "If-None-Match" con el valor ETag contenido en la respuesta anterior del servidor para esa url. Ahora, si programáticamente agrego el encabezado de solicitud "If-Modified-Since" y lo configuro para una fecha futura o pasada (no importa), el navegador deja de enviar la "Cabecera" If-None-Match ". Lo he visto tanto en Firefox como en Chrome (no probado con ningún otro navegador). No puedo concluir de la especificación de HTTP/1.1 que este debería ser el caso. ¿Por qué pasó esto?If-Modified-Since reemplaza If-None-Match en el navegador

Aquí hay un ejemplo de código simple que reproducirá el escenario. El código supone que el servidor responde con un encabezado Etag.

var request = new XMLHttpRequest(); 
request.open("GET", someUrl, true); 
request.onreadystatechange = function(){}; 

// This statement makes the browser stop sending the "If-None-Match" header 
request.setRequestHeader("If-Modified-Since", "Sat, 29 Oct 1994 19:43:31 GMT"); 

request.send(null); 
+1

En su lugar, puede leer http://greenbytes.de/tech/webdav/draft-ietf-httpbis-p4-conditional-21.html. –

Respuesta

4

Ahora, si yo programáticamente añadir la solicitud en la cabecera "If-Modified-Since" y se establece en un futuro o bien una fecha pasada (no importa), el navegador deja de enviar el " If-None-Match "-header.

No deberían, si el servidor proporciona tanto un eTag y cabecera Last-Modified para el recurso dado:

clientes HTTP/1.1 [...] si tanto una etiqueta de entidad y un valor Last-Modified ha sido proporcionado por el servidor de origen, DEBERÍA usar ambos validadores en solicitudes condicionales de caché. Esto permite HTTP/1.0 y cachés HTTP/1.1 responder adecuadamente.

Editar: al llamar XmlHttpRequest.open(), la aplicación prepara una solicitud utilizando un nsIHttpChannel, utilizando entre otros los If-Modified-Since y If-None-Match encabezados si se puede encontrar un artículo en caché local.

Ahora cuando llame al SetRequestHeader() con If-(Un)Modified-Since o If-None-Match, borrará ambos encabezados de la solicitud y establecerá su valor.

+0

El servidor no proporciona un encabezado Last-Modified. La razón por la cual el navegador tiene que establecer el encabezado If-Modified-Since (en realidad, solo IE lo necesita) es para evitar el caché excesivamente agresivo de IE. En mi código establezco If-Modified-Since a la hora actual, y además también configuro "Cache-Control": "max-age = 0". – Tore

+0

@Más ver edición. Es la implementación de XHR la que hace esto. Si anula el almacenamiento en caché integrado configurando un encabezado relacionado, elimina todos los encabezados de caché que haya establecido. – CodeCaster

+0

¿Quiere decir setRequestHeader(), no setResponseHeader()? – Tore

Cuestiones relacionadas