2010-01-21 16 views
41

¿Qué significa el siguiente encabezado HTTP 1.1?¿Qué significa el encabezado HTTP If-None-Match: * mean?

If-None-Match: *

entiendo que cuando se utiliza un ETag fuerte o débil, o incluso una lista de ETags, pero no me understant su uso cuando se usa estrella (*) .

Editar: sería bueno tener algo de pseudocódigo (código PHP bueno también) que mostraría cómo/qué responder a "If-None-Match: *".

Respuesta

36

La respuesta es: depende.

Supongamos que hemos recibido

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

Y la página se ha alterado hoy.

Primero, echamos un vistazo al * que nos dice: "Devuelve 304 si el recurso está allí y se cumple la condición (2)". Bien, el recurso existe, PERO la condición (2) establece: "Solo devuelve 304, si la fecha es posterior a la actual". Por lo tanto, esta condición no se cumple y la página se entregará por completo.

Si no hubiéramos recibido If-Modified-Since, la respuesta habría sido 304.

Si el recurso no había existido bajo petición, nos han devuelto el código apropiado (como si no había If-None-Match).

304 solo debe devolverse en respuesta a solicitudes GET y HEAD, y todos los encabezados de respuesta relacionados con caché deben estar allí. Para todos los demás tipos de solicitudes, su servidor debe responder al 412 (condición previa no).

Espero que ayude;)

+0

Entonces, cuando tiene * en If-None-Match, ¿la única manera de emitir un 304 es cuando el If-Modified-Since está configurado y haciendo juego? – AlexV

+1

O eso, o sin 'If-Modified-Since' en absoluto. Entonces hay 2 formas. –

10

Citando RFC 2616 (HTTP 1.1):

... si "*" se da y existe ninguna entidad actual para ese recurso, el servidor NO DEBE realizar el método solicitado, a menos que así lo requiere porque el recurso de la fecha de modificación no coincide con la proporcionada en un campo de encabezado If-Modified-Since en la solicitud.

El RFC continúa diciendo que en lugar de realizar la solicitud, los servidores deben responder con 304 (no modificado) para peticiones GET y la cabeza, y que deben responder con 412 (precondición no) para todos los demás tipos de peticiones . Pero eso es solo si el servidor realmente tiene alguna versión del recurso solicitado. Si no tiene ninguna entidad, entonces debe manejar la solicitud (probablemente con un 404 ya que no tiene nada).

Para manejar una solicitud, primero descubra qué haría el servidor si ese encabezado no fuera presente. Si el resultado de esa solicitud fuera no sea 2xx o 304, luego atienda la solicitud como de costumbre. Pero si el resultado de la solicitud sería ser 2xx o 304, entonces maneje el caso If-None-Modified. Cuando es una estrella, simplemente devuelve 304 inmediatamente (a menos que sea superado por If-Modified-Since). Si se trata de una o más etiquetas de entidad, compruebe si alguna de esas etiquetas coincide con la etiqueta de lo que estaba planeando servir como respuesta. Si hay alguna coincidencia, devuelva 304; si no hay coincidencia, entonces sírvela como lo harías normalmente.

Más adelante en el RFC, hay más:

El significado de "If-None-Match: *" es que el método no debe llevarse a cabo si la representación seleccionada por el servidor de origen (o por una caché, posiblemente utilizando el mecanismo Vary, consulte la sección 14.44) existe, y DEBE realizarse si la representación no existe. Esta función está destinada a ser útil para evitar carreras entre operaciones PUT.

Es decir, la estrella permite al cliente a decir: "No ponga este archivo si hay cualquier versión de este archivo ya existe."

+3

¿Y qué significa esto en inglés llano? Si * se suministra, solo sirvo la página normalmente (sin un 304)? Incluso si se proporciona If-Modified-Since ... – AlexV

Cuestiones relacionadas