2008-10-15 17 views

Respuesta

0

Puede hacerlo si utiliza los encabezados de respuesta http correctamente, pero a menudo se pasa por alto.

De lo contrario, almacenar un md5-hash local del contenido puede ser útil para usted (a menos que haya una cadena de contenido más fácil que pueda enganchar). No es ideal (porque es un proceso bastante lento) pero es una opción.

0

Sí, puede y debe usar encabezados HTTP para marcar las páginas como no expiradas. Sin embargo, si son dinámicos (PHP, ASPX, etc.) y/o son manejados por bases de datos, necesitará controlar manualmente la configuración del encabezado Expira/enviando HTTP No Modificado apropiadamente. ASP.NET tiene algunos objetos SqlDependency para esto, pero aún necesitan ser configurados y administrados. (No estoy seguro si PHP tiene algo igual, pero allí si no es probable que haya algo en PERA ...)

1

Este es el propósito exacto de la cabecera ETag, pero tiene que ser compatible con su marco web o es necesario tener cuidado de que su aplicación responde adecuadamente a las peticiones con encabezados If-Match, Si-No-Match y Si-Rango (ver HTTP Ch 3.11).

0

El encabezado Last-Modified solo te servirá si el programador del sitio lo ha configurado explícitamente para devolverse.

Para una página normal, estática Last-Modified es la fecha y hora de la última modificación del archivo HTML. Para una página generada dinámicamente, el servidor no puede asignar de manera confiable un valor Last-Modified, ya que no tiene una forma real de saber cómo ha cambiado el contenido dependiendo de la solicitud, por lo que muchos servidores no generan el encabezado en absoluto.

Si tiene control sobre la página, entonces asegurarse de que se está estableciendo el encabezado Última modificación garantizará que una comprobación en Last-Modified sea exitosa. De lo contrario, tendrá que buscar la página y realizar una expresión regular para encontrar una sección modificada (por ejemplo, fecha/hora en el encabezado de un sitio de noticias). Si no existe ese marcador obvio, entonces duplicaría el Oli's suggestion de un MD5 en el contenido de la página como una forma de estar seguro de que ha cambiado.

2

Aunque pueda parecer obsoleto, siempre he encontrado que el artículo de Simon Willison en Conditional GET es más que útil. El ejemplo está en PHP, pero es tan simple que puedes adaptarlo a otros idiomas. Aquí está el ejemplo:

function doConditionalGet($timestamp) { 
    // A PHP implementation of conditional get, see 
    // http://fishbowl.pastiche.org/archives/001132.html 
    $last_modified = substr(date('r', $timestamp), 0, -5).'GMT'; 
    $etag = '"'.md5($last_modified).'"'; 

    // Send the headers 
    header("Last-Modified: $last_modified"); 
    header("ETag: $etag"); 

    // See if the client has provided the required headers 
    $if_modified_since = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? 
     stripslashes($_SERVER['HTTP_IF_MODIFIED_SINCE']) : 
     false; 

    $if_none_match = isset($_SERVER['HTTP_IF_NONE_MATCH']) ? 
     stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) : 
     false; 

    if (!$if_modified_since && !$if_none_match) { 
     return; 
    } 

    // At least one of the headers is there - check them 
    if ($if_none_match && $if_none_match != $etag) { 
     return; // etag is there but doesn't match 
    } 

    if ($if_modified_since && $if_modified_since != $last_modified) { 
     return; // if-modified-since is there but doesn't match 
    } 

    // Nothing has changed since their last request - serve a 304 and exit 
    header('HTTP/1.0 304 Not Modified'); 
    exit; 
} 

Con ello se puede utilizar verbos HTTP GET o HEAD (creo que también es posible con el others, pero no puedo ver la razón para usarlos). Todo lo que necesita hacer es agregar If-Modified-Since o If-None-Match con los valores respectivos de los encabezados Last-Modified o ETag enviados por una versión anterior de la página. A partir de la versión 1.1 de HTTP se recomienda ETag sobre Last-Modified, pero ambos harán el trabajo.

Este es un ejemplo muy simple de cómo funciona un GET condicional.Lo primero que necesitamos para recuperar la página de la forma habitual:

GET /some-page.html HTTP/1.1 
Host: example.org

primera respuesta con las cabeceras y contenidos condicionales:

200 OK 
ETag: YourETagHere

ahora la solicitud GET condicional:

GET /some-page.html HTTP/1.1 
Host: example.org 
If-None-Match: YourETagHere

y la respuesta que indica puede usar la versión en caché de la página, ya que solo se entregarán los encabezados:

304 Not Modified 
ETag: YourETagHere

Con esto el servidor le notificó que no hubo modificaciones en la página.

También puedo recomendarle otro artículo sobre GET condicional: HTTP conditional GET for RSS hackers.

Cuestiones relacionadas