2012-10-11 11 views
5

Ho un server Web che fornisce un ETag per un URL particolare. Quando il browser esegue una richiesta per questo URL, fornisce l'intestazione http "If-None-Match" con il valore ETag contenuto nella risposta precedente dal server per quell'URL. Ora, se aggiungo programmaticamente l'intestazione della richiesta "If-Modified-Since" e lo imposto in una data futura o passata (non importa), il browser interrompe l'invio dell'header "If-None-Match". Ho visto questo in FireFox e Chrome (non testato con nessun altro browser). Non posso concludere dalle specifiche HTTP/1.1 che questo dovrebbe essere il caso. Perché succede?Se modificato, poiché sostituisce Se-Nessuno-Match nel browser

Ecco un semplice esempio di codice che riprodurrà lo scenario. Il codice presuppone che il server risponda con un'intestazione 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

Si consiglia di leggere invece http://greenbytes.de/tech/webdav/draft-ietf-httpbis-p4-conditional-21.html. –

risposta

4

Ora, se io programatically aggiungere la richiesta-intestazione "If-Modified-Since" e impostarlo su un sia un futuro o data passata (non importa), il browser interrompe l'invio del " If-None-match "-Intestazione.

Essi non dovrebbe, se il server fornisce sia in un Etag e Last-Modified per la risorsa data:

HTTP/1.1 i clienti [...] se sia un tag di entità e un valore Ultima modifica è stato fornito dal server di origine, DOVREBBE utilizzare entrambi i validatori nelle richieste condizionali della cache . Ciò consente sia la cache HTTP/1.0 che la cache HTTP/1.1 per rispondere in modo appropriato.

Edit: quando si chiama XmlHttpRequest.open(), l'attuazione prepara una richiesta utilizzando un nsIHttpChannel, utilizzando tra l'altro i If-Modified-Since e If-None-Match intestazioni se può trovare un elemento memorizzato nella cache locale.

Ora quando si chiama SetRequestHeader() con If-(Un)Modified-Since o If-None-Match, si cancellano entrambe le intestazioni dalla richiesta e si imposta il valore.

+0

Il server non fornisce un'intestazione Last-Modified. Il motivo per cui il browser deve impostare l'intestazione If-Modified-Since (in realtà, solo IE ne ha bisogno) è quello di prevenire la memorizzazione eccessiva della cache di IE. Nel mio codice ho impostato If-Modified-Since al tempo corrente, e inoltre ho anche impostato "Cache-Control": "max-age = 0". – Tore

+0

@Tore vedi modifica. È l'implementazione XHR che fa questo. Se si esegue l'override della memorizzazione nella cache incorporata impostando qualsiasi intestazione correlata, rimuove tutte le intestazioni della cache che ha impostato. – CodeCaster

+0

Intendi setRequestHeader(), non setResponseHeader()? – Tore

Problemi correlati