2010-01-21 13 views
41

Che cosa significa la seguente intestazione HTTP 1.1?Cosa significa intestazione HTTP If-None-Match: * significa?

If-None-Match: *

Capisco che quando si utilizza un ETag forte o debole o anche un elenco di ETags, ma io non understant il suo uso quando si utilizza stella (*) .

Modifica: Sarebbe bello avere qualche pseudocodice (codice PHP valido anche) che mostrerebbe come/cosa rispondere a "If-None-Match: *".

risposta

36

La risposta è: dipende.

Supponiamo di avere ricevuto

If-None-Match: * 
If-Modified-Since: <yesterday date> 

E la pagina è stata modificata oggi.

Per prima cosa, diamo uno sguardo allo * che ci dice: "Restituisce 304 se la risorsa è presente e condizione (2) è soddisfatta". Bene, la risorsa esiste, condizione BUT (2) afferma: "Restituisce solo 304, se la data è successiva alla corrente". Quindi questa condizione non è soddisfatta e la pagina verrà consegnata completamente.

Se non avessimo ricevuto If-Modified-Since, la risposta sarebbe stata 304.

Se la risorsa non fosse esistito, su richiesta, avremmo restituito il codice appropriato (come se non ci fosse If-None-Match).

304 deve essere restituito solo in risposta per le richieste GET e HEAD e tutte le intestazioni di risposta relative alla cache devono essere presenti. Per tutti gli altri tipi di richiesta, il server deve rispondere a 412 (precondizione non riuscita).

Spero che sia d'aiuto;)

+0

Quindi quando hai * in If-None-Match l'unico modo per emettere un 304 è quando If-Modified-Since è impostato e corrispondente? – AlexV

+1

O questo, o senza "Se-Modificato-Dal". Quindi ci sono 2 modi. –

10

Citando RFC 2616 (HTTP 1.1):

... se "*" viene dato e non esiste alcuna entità corrente per la risorsa, il server NON DEVE eseguire il metodo richiesto, se non richiesto di farlo perché la risorsa del la data di modifica non corrisponde a quella fornita in un campo di intestazione If-Modified-Since nella richiesta.

La RFC continua a dire che invece di eseguire la richiesta, i server dovrebbero rispondere con 304 (non modificato) per le richieste GET e la testa, e che dovrebbero rispondere con 412 (presupposto non) per tutti gli altri tipi di richiesta . Ma questo è solo se il server ha effettivamente qualche versione della risorsa richiesta. Se non hai alcuna entità, allora lo dovrebbe gestire la richiesta (probabilmente con un 404 dato che non hai nulla).

Per gestire una richiesta, innanzitutto capire cosa il server farebbe se quell'intestazione non fosse presente. Se il risultato di tale richiesta è non essere 2xx o 304, quindi servire la richiesta normalmente. Ma se il risultato della richiesta è essere 2xx o 304, quindi gestire il caso If-None-Modified. Quando è una stella, restituisce immediatamente 304 (a meno che non venga trumpato da If-Modified-Since). Se si tratta di uno o più tag di entità, controlla se uno di questi tag corrisponde al tag della cosa che avevi intenzione di offrire come risposta. Se c'è una corrispondenza, restituisci 304; se non c'è corrispondenza, servitela come faresti normalmente.

Più tardi nel RFC, c'è di più:

Il significato di "If-None-Match: *" è che il metodo non deve essere eseguita se la rappresentazione selezionato dal server di origine (o da un la cache, possibilmente utilizzando il meccanismo Vary, vedere la sezione 14.44) esiste e DEVE essere eseguita se la rappresentazione non esiste. Questa funzione è pensata per essere utile nel prevenire le razze tra le operazioni PUT.

Cioè, la stella permette al cliente di dire: "Non mettere questo file se c'è qualsiasi versione di questo file già lì".

+3

E cosa significa in inglese normale? Se * viene fornito, semplicemente servo la pagina normalmente (senza un 304)? Anche se If-Modified-Since viene fornito ... – AlexV