2008-10-15 13 views

Antwort

0

Sie können, wenn es die HTTP-Antwort-Header korrekt verwendet, aber es wird oft übersehen.

Andernfalls könnte es nützlich sein, einen lokalen md5-Hash des Inhalts zu speichern (es sei denn, es gibt eine einfachere In-Content-Zeichenfolge, die Sie abhaken könnten). Es ist nicht ideal (weil es ein ziemlich langsamer Prozess ist), aber es ist eine Option.

0

Ja, Sie können und sollten HTTP-Header verwenden, um Seiten als nicht abgelaufen zu markieren. Wenn sie jedoch dynamisch (PHP, ASPX usw.) und/oder datenbankgesteuert sind, müssen Sie die Einstellung der Expires-Kopfzeile/HTTP-Not-Modified-Verarbeitung manuell steuern. ASP.NET verfügt hierfür über einige SqlDependency-Objekte, die jedoch noch konfiguriert und verwaltet werden müssen. (Nicht sicher, ob PHP hat etwas so wie es, aber es ist wahrscheinlich etwas in PEAR, wenn auch nicht ...)

1

Dies ist der genaue Zweck des ETag Header, aber es hat von Ihrem Web-Framework unterstützt werden oder Sie müssen darauf achten, dass Ihre Anwendung ordnungsgemäß auf Anfragen mit Kopfzeilen antwortet. If-Match, If-Not-Match und If-Bereich (siehe HTTP Ch 3.11).

0

Der Header wird nur für Sie von Nutzen sein, wenn der Programmierer der Site explizit festgelegt hat, dass er zurückgegeben werden soll.

Für eine reguläre, statische Seite ist der Zeitstempel der letzten Änderung der HTML-Datei. Für eine dynamisch generierte Seite kann der Server keinen -Wert zuweisen, da er nicht wirklich wissen kann, wie sich der Inhalt je nach Anforderung geändert hat, so dass viele Server den Header überhaupt nicht generieren.

Wenn Sie die Kontrolle über die Seite haben, dann wird sichergestellt, dass der Header Letzte Änderung gesetzt ist, um sicherzustellen, dass eine Überprüfung auf erfolgreich ist. Andernfalls müssen Sie möglicherweise die Seite abrufen und entweder eine Regex ausführen, um einen geänderten Abschnitt zu finden (z. B. Datum/Uhrzeit in der Kopfzeile einer Nachrichtenwebsite). Wenn kein solcher offensichtlicher Marker existiert, dann würde ich Oli's suggestion eines MD5 auf dem Seiteninhalt als zweite Möglichkeit angeben, um sicherzugehen, dass es sich geändert hat.

2

Auch wenn Sie denken, dass es veraltet ist, fand ich Simon Willisons Artikel auf Conditional GET immer mehr als nützlich. Das Beispiel ist in PHP, aber es ist so einfach, dass Sie es an andere Sprachen anpassen können. Hier ist es das Beispiel:

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; 
} 

Damit Sie HTTP-Verben GET oder HEAD verwenden können (ich glaube, es ist auch möglich, mit den others, aber ich kann nicht sehen, den Grund, sie zu benutzen). Sie müssen entweder If-Modified-Since oder If-None-Match mit den entsprechenden Werten der Header oder ETag, die von einer früheren Version der Seite gesendet wurden, hinzufügen. Ab HTTP-Version 1.1 wird empfohlen, ETag über , aber beide werden die Arbeit tun.

Dies ist ein sehr einfaches Beispiel dafür, wie ein bedingtes GET funktioniert.Zunächst müssen wir die Seite auf die übliche Weise abzurufen:

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

erste Reaktion mit bedingten Header und Inhalte:

200 OK 
ETag: YourETagHere

Nun ist die bedingte GET-Anfrage:

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

Und die Antwort, die anzeigt Sie können die zwischengespeicherte Version der Seite verwenden, da nur die Header geliefert werden:

304 Not Modified 
ETag: YourETagHere

Mit diesem hat der Server Sie benachrichtigt, es gab keine Änderung an der Seite.

Ich kann Ihnen auch einen anderen Artikel über bedingte GET empfehlen: HTTP conditional GET for RSS hackers.

Verwandte Themen