Pregunta

Estoy escribiendo un recurso de método de control donde puedo controlar el acceso a varios archivos, y me gustaría ser capaz de hacer uso de la caché del navegador.Mi pregunta es doble:

  1. Que son los definitivos encabezados HTTP que tengo que consultar para saber con certeza si debo enviar una respuesta 304, y lo que estoy buscando cuando me echa?

  2. Además, hay encabezados de que tengo que enviar al principio me enviar el archivo (como "Última Modificación") como una respuesta 200?

Algunos pseudo-código probablemente sería más útil la respuesta.


Lo que sobre el encabezado cache-control?Pueden los distintos valores posibles de y que afectan a lo que usted envíe al cliente (es decir, max-age) o sólo if-modified-since ser obedecido?

¿Fue útil?

Solución

He aquí cómo he puesto en práctica.El código ha estado trabajando durante un poco más de un año y con múltiples navegadores, por lo que creo que es bastante fiable.Esto se basa en RFC 2616 y observando qué y cuándo los distintos navegadores estaban enviando.

Aquí está el pseudocódigo:

server_etag = gen_etag_for_this_file(myfile)
etag_from_browser = get_header("Etag")

if etag_from_browser does not exist:
    etag_from_browser = get_header("If-None-Match")
if the browser has quoted the etag:
    strip the quotes (e.g. "foo" --> foo)

set server_etag into http header

if etag_from_browser matches server_etag
    send 304 return code to browser

He aquí un fragmento de mi lógica de servidor que se encarga de esto.

/* the client should set either Etag or If-None-Match */
/* some clients quote the parm, strip quotes if so    */
mketag(etag, &sb);

etagin = apr_table_get(r->headers_in, "Etag");
if (etagin == NULL)
    etagin = apr_table_get(r->headers_in, "If-None-Match");
if (etag != NULL && etag[0] == '"') {
    int sl; 
    sl = strlen(etag);
    memmove(etag, etag+1, sl+1);
    etag[sl-2] = 0;
    logit(2,"etag=:%s:",etag);
}   
... 
apr_table_add(r->headers_out, "ETag", etag);
... 
if (etagin != NULL && strcmp(etagin, etag) == 0) {
    /* if the etag matches, we return a 304 */
    rc = HTTP_NOT_MODIFIED;
}   

Si quieres algo de ayuda con etag generación post otra pregunta y voy a sacar un poco de código que hace eso.HTH!

Otros consejos

304 No Modificado la respuesta puede ser el resultado de una solicitud GET o HEAD con un If-Modified-since ("IMS"), o una Si-No-Match ("INM") encabezado.

Con el fin de decidir qué hacer cuando recibe estos encabezados, imagine que usted es el manejo de la solicitud sin que estos encabezados condicionales.Determinar cuáles son los valores de su ETag y de Última Modificación encabezados sería en el que la respuesta y el uso de ellos para tomar la decisión.Esperemos que han construido su sistema de modo tal que la determinación de que esto es menos costoso que la construcción de la respuesta completa.

Si hay un INM y el valor de la cabecera es el mismo que el valor que tendría lugar en el ETag, y luego responder con 304.

Si hay un IMS y la fecha valor en que el encabezado es posterior a la que tendría lugar en la Última Modificación, y luego responder con 304.

Otra cosa, proceder como si la solicitud no contiene los encabezados.

Por lo menos un esfuerzo de aproximación a la parte 2 de su pregunta, de cuál de los (Expira, ETag, y de Última Modificación) de las cabeceras usted puede fácilmente y correctamente producir en la aplicación Web.

Para material de lectura sugerido:

http://www.w3.org/Protocols/rfc2616/rfc2616.html

http://www.mnot.net/cache_docs/

Usted debe enviar una 304 si el cliente ha declarado explícitamente que ya puede tener la página en su caché.Esto se llama un condicional, la cual debe incluir la if-modified-since encabezado de la solicitud.

Básicamente, este encabezado de solicitud contiene una fecha desde la que el cliente pretende tener una copia en la caché.Usted debe comprobar si el contenido ha cambiado después de esta fecha y enviar un 304 si no lo ha hecho.

Ver http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.25 para la sección relacionada en el RFC.

También estamos manejo de caché, pero aseguró, recursos.Si usted enviar / generar un ETAg cabecera (RFC 2616 sección 13.3 recomienda que usted), entonces el cliente DEBE utilizar en una solicitud condicional (normalmente dentro de un If-None-Match - HTTP_IF_NONE_MATCH - encabezado).Si usted envía una Última Modificación de encabezado (de nuevo que DEBERÍA), entonces usted debe comprobar la If-Modified-since - HTTP_IF_MODIFIED_SINCE - encabezado.Si usted envía tanto, el cliente DEBE enviar a ambos, pero DEBE enviar el ETag.También tenga en cuenta que validtion es definido como la comprobación de los encabezados condicionales para la igualdad estricta en contra de los que usted envíe.Además, sólo un fuerte validador (tales como un ETag) será utilizado para osciló solicitudes (donde sólo una parte de un recurso que se solicita).

En la práctica, ya que los recursos que se protegen son bastante estáticos, y un segundo de tiempo de retraso es aceptable, estamos haciendo lo siguiente:

  1. Revise para ver si el usuario está autorizado para acceder al recurso solicitado

    Si no lo son, Redireccionar o enviar un 4xx respuesta según corresponda.Vamos a generar 404 respuestas a las solicitudes que se parecen a los intentos de hack o flagrante intenta realizar una seguridad final de ejecución.

  2. Comparar la If-Modified-since encabezado de la Última Modificación encabezado íbamos a enviar (ver más abajo) para la igualdad estricta

    Si coinciden, enviar un 304 No Modificado la respuesta y la salida de la página de procesamiento de

  3. Crear un encabezado Modificado mediante el tiempo de modificación del recurso solicitado

    Buscar el HTTP formato de Fecha en el RFC 2616

  4. Enviar el encabezado y el contenido del recurso, junto con un adecuado Contenido de Tipo

Decidimos prescinden de la cabecera ETag ya que es demasiado para nuestros propósitos.Supongo que también podríamos utilizar la marca de fecha y hora como un ETag.Si nos movemos a un verdadero ETag sistema, que probablemente iba a la tienda calculan los valores hash de los recursos y utilizarlos como ETags.

Si sus recursos son generados dinámicamente, por ejemplo de contenido de base de datos, entonces ETags puede ser mejor para sus necesidades, ya que son sólo de texto para ser pobladas, como usted ve ajuste.

con respecto a cache-control:

Usted no debería tener que preocuparse por el control de caché al momento de servir, otros de ajuste a un valor razonable.Se trata básicamente de decirle al navegador y otro aguas abajo de las entidades (tales como un proxy) el tiempo máximo que debe transcurrir antes de que se agote la memoria caché.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top