puede solicitar que el encabezado http verifique si una página web ha sido editada mirando su fecha, pero qué hay de las páginas dinámicas como - php, aspx ¿Qué toma sus datos de una base de datos?¿Puedo usar "http header" para verificar si se ha cambiado una página dinámica
Respuesta
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.
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 ...)
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).
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.
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.
- 1. Wicket: notifique si el modelo de página ha sido cambiado
- 2. ¿Cómo verificar si la entidad ha cambiado en Doctrine 2?
- 3. ¿Cómo detectar si una variable ha cambiado?
- 4. Determine si la página ha cambiado usando Webdriver
- 5. Método que requiere menos CPU para verificar si una lista ha cambiado en C#
- 6. ¿Cómo puedo verificar si se ha configurado JavaScript-Eventhandler?
- 7. ¿Cómo puedo verificar si una estructura ha sido instanciada?
- 8. ¿Por qué ha cambiado Hibernate para usar LONG over CLOB?
- 9. Javascript: compruebe si el elemento ha cambiado
- 10. Cómo detectar si una propiedad del Sistema Java ha cambiado?
- 11. ASIHTTPRequest y http header
- 12. DataGridView & BindingList: ¿Cómo verificar si el valor de la celda ha cambiado?
- 13. Código para verificar cuando la página ha terminado de cargarse
- 14. Range Header HTTP para Entidad enumera
- 15. ¿es una buena práctica usar iframe para implementar header/navbar?
- 16. Verificar si se selecciona una página de pestañas específica (activa)
- 17. Cómo detectar si un elemento en mi ObservableCollection ha cambiado
- 18. ¿Cómo verificar si __PRETTY_FUNCTION__ se puede usar?
- 19. ¿Cómo puedo hacer que vim revise automáticamente si el archivo ha cambiado externamente?
- 20. ¿Puedo usar NSURLCredentialStorage para autenticación básica HTTP?
- 21. Verificar/Verificar para ver si se ha instalado un Perfil de configuración en el iPhone
- 22. ¿Cómo puedo detectar si la hora del sistema ha cambiado? (de .net)
- 23. ¿Cómo ha cambiado Haskell?
- 24. ¿Cómo puedo verificar desde Android WebView si una página es una "página 404 no encontrada"?
- 25. requiere un archivo de nuevo si ha cambiado
- 26. Cómo ver si un subarchivo de un directorio ha cambiado
- 27. Cómo saber si el registro ha cambiado en Postgres
- 28. ¿Cómo verificar si el hilo ha finalizado?
- 29. ¿Cómo verificar si una característica ha sido activada?
- 30. Cómo verificar si una cadena contiene http: // al inicio
¿Alguna de las soluciones propuestas funcionó para usted? –