2012-07-06 10 views
42

¿Cuál es la diferencia entre Expires: 0 y Expires: -1 en el encabezado de respuesta HTTP? RFC 2616 define formatos de fecha no válidos, especialmente incluyendo el valor "0" como ya caducado. Sin embargo, algunos servidores (por ejemplo, www.google.de) responden con Expires: -1.HTTP expira los valores de encabezado "0" y "-1"

¿Existe una ventaja con respecto al uso de -1 sobre 0 o incluso es necesario para algunos clientes HTTP rotos?

+4

No define '" 0 "' como "ya caducado" - define "formatos de fecha inválidos", * incluyendo * '" 0 "', como "ya expiró" –

+0

Correcto, gracias por esta sugerencia. Pero me parece que debería preferirse "0" al especificar un "formato de fecha no válido". – scai

+2

No, la preferencia (expresada en el párrafo siguiente) es usar un formato de fecha válido, que contenga el mismo valor que el encabezado 'Fecha', para indicar que ya expiró. –

Respuesta

29

El problema está en cómo el encabezado de Caducidad no válido procesado por Internet Explorer (especialmente versiones anteriores). IE utiliza el motor de diseño Trident y la API WinINET para procesar las solicitudes HTTP. Como ya sabrán caduca podría ser especificado en el encabezado HTTP

Expires: 0 

o en la etiqueta meta

<meta http-equiv="Expires" content="0"> 

En segundo caso, Expira se convirtió en parte del contenido de la respuesta (no cabecera Content), por lo que será processed by Trident and then propagated to WinINET:

Si WinINET descargas una respuesta con un inválido Expira cabecera (por ejemplo uno que no contiene un valor válido HTTPDATE) y ningún otro almacenamiento en caché directivas, marcará que el documento ha expirado hace una hora. Trident, sin embargo, no tiene esa lógica. Si especifica una hora no válida, Trident toma la marca de tiempo actual y la utiliza como fecha de caducidad. Trident también usará la marca de tiempo actual si encuentra la directiva Pragma: no-cache . Si el usuario intenta volver a navegar al documento actual durante el mismo segundo exacto en que se procesó HTTP/404 , la caducidad de la caché existente caducada incorrectamente dará como resultado que se trate como nueva para esa solicitud. Si el usuario presiona el botón Actualizar o F5, se omitiría el caché y se mostraría la página 404.

En otras palabras Expires: 0 no siempre conduce a la caducidad inmediata de recursos, por lo tanto, se debe evitar y Expires: [some valid date in the past] se debe utilizar en su lugar.

+1

Esa es la respuesta del "cliente HTTP roto" que estaba esperando y explica el motivo de "Caduca: -1", ¡gracias! :) – scai

+9

3 upvotes? ¿Alguien siquiera leyó la respuesta? De acuerdo con el artículo, no hay * diferencia * entre 'Vence: -1 'y' Vence: 0'. – user123444555621

+4

Eso es correcto. El artículo solo explica un * Expirado = 0 * incorrectamente manejado en el metaelemento HTML. Ni una sola palabra sobre * Expira = -1 * u otros valores Expira incorrectamente manejados en el encabezado HTTP. – scai

8

Expira: -1 El encabezado Expires especifica cuándo se debe considerar que el contenido está desactualizado. El valor -1 indica que el contenido caduca inmediatamente y debería volver a solicitarse antes de volver a mostrarse. http://www.httpwatch.com/httpgallery/headers/

max-age = 0 simplemente le dice cachés (y agentes de usuario) la respuesta es rancio desde el primer momento y por lo que deben revalidar la respuesta (por ejemplo. Con el encabezado-Not Modified-Si) antes de usar una copia en caché, mientras que, no-cache les dice que DEBEN revalidar antes de usar una copia en caché.

para obtener más información mire en http://www.w3.org/Protocols/HTTP/1.1/rfc2616.pdf

+2

Gracias, pero mi pregunta ha sido específicamente sobre la diferencia entre 'Expires: 0' y' Expires: -1'. – scai

+0

+1 Aunque en realidad no es una respuesta a la pregunta, pero es relevante para el tema. Me parece que si intentas agregar caducas: -1 o 0 probablemente también estarás usando la edad máxima = 0. Probablemente debería haber sido un comentario en lugar de una respuesta. –

1

El uso de "-1" no es válido, y sería tratado lo mismo que "0". No debería disparar una recarga en absoluto.

Tenga cuidado: en algunos navegadores, puede dar una hora extra o utilizar el tiempo de caducidad predeterminado para el cobro.

1- Así que mejor que darle una vieja fecha correcta como:

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /> 
<meta http-equiv="Pragma" content="no-cache" /> 
<meta http-equiv="Expires" content="Tue, 01 Jan 1980 1:00:00 GMT" /> 

Para el trabajo formal, consejo que dar la fecha y hora actuales a meta Expira en lugar de utilizar fecha fijada Viejo (que hará Los motores de búsqueda como Google marcan su sitio como edad y no se mostrarán en acolchados)

2- si su backend es PHP se puede tratar con él como:

<meta http-equiv="Expires" content="<?php echo gmdate('D, d M Y H:i:s', time()-3600) . ' GMT' ?>" /> 

PD: doy una hora antes solo por si acaso.

Cuestiones relacionadas