wake-up-neo.com

Was ist Cache-Control: privat?

Wenn ich chesseng.herokuapp.com besuche, erhalte ich einen Antwortheader, der so aussieht

Cache-Control:private
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/css
Date:Tue, 16 Oct 2012 06:37:53 GMT
Last-Modified:Tue, 16 Oct 2012 03:13:38 GMT
Status:200 OK
transfer-encoding:chunked
Vary:Accept-Encoding
X-Rack-Cache:miss

und dann aktualisiere ich die seite und bekomme

Cache-Control:private
Connection:keep-alive
Date:Tue, 16 Oct 2012 06:20:49 GMT
Status:304 Not Modified
X-Rack-Cache:miss

es scheint also, als würde das Cachen funktionieren. Wenn dies für das Cachen funktioniert, wozu dient dann der Expires und Cache -Control: Höchstalter . Wenn ich die Seite unter https://developers.google.com/speed/pagespeed/insights/ teste, sollte ich "Browser-Caching nutzen".

138
user782220

Um Ihre Frage zu beantworten, warum Caching funktioniert, obwohl der Webserver die Header nicht enthielt:

  • Läuft ab: [a date]
  • Cache-Kontrolle: max-age = [seconds]

Der Server hat alle zwischengeschalteten Proxys freundlich gebeten, den Inhalt nicht zwischenzuspeichern (d. H. Das Element sollte nur in einem privaten Cache zwischengespeichert werden, d. H. Nur auf Ihrem eigenen lokalen Computer):

  • Cache-Kontrolle: privat

Der Server hat jedoch vergessen, irgendwelche Caching-Hinweise einzuschließen:

  • sie haben vergessen, einzuschließen. Läuft ab , sodass der Browser weiß, dass die zwischengespeicherte Kopie bis zu diesem Datum verwendet wird
  • sie haben vergessen, Max-Age einzuschließen, damit der Browser weiß, wie lange das zwischengespeicherte Element gültig ist
  • sie haben vergessen, E-Tag einzuschließen, damit der Browser eine bedingte Anforderung ausführen kann

Die Antwort enthielt jedoch ein Datum der letzten Änderung :

Last-Modified: Tue, 16 Oct 2012 03:13:38 GMT

Da der Browser das Änderungsdatum der Datei kennt, kann er eine bedingte Anforderung ausführen. Der Server wird nach der Datei gefragt, der Server wird jedoch angewiesen, die Datei nur zu senden, wenn sie seit dem 16.10.2012 um 3:13:38 Uhr geändert wurde:

GET / HTTP/1.1
If-Modified-Since: Tue, 16 Oct 2012 03:13:38 GMT

Der Server erhält die Anfrage, erkennt, dass der Client bereits die aktuellste Version hat. Anstatt den Client 200 OK gefolgt vom Inhalt der Seite zu senden, wird Ihnen stattdessen mitgeteilt, dass Ihre zwischengespeicherte Version in Ordnung ist:

304 Not Modified

Ihr Browser musste die Verzögerung beim Senden einer Anfrage an den Server und das Warten auf eine Antwort erleiden, musste jedoch den statischen Inhalt nicht erneut herunterladen.

Warum maximales Alter ? Warum läuft ab ?

Denn Last-Modified ist scheiße.

Nicht allen Servern ist ein Datum zugeordnet. Wenn ich gerade eine Seite baue, ist kein Datum damit verbunden - es ist jetzt . Aber ich bin durchaus bereit, den Benutzer die Homepage für 15 Sekunden zwischenspeichern zu lassen:

200 OK
Cache-Control: max-age=15

Wenn der Benutzer hämmert F5erhalten sie die zwischengespeicherte Version für 15 Sekunden. Wenn es sich um einen Unternehmens-Proxy handelt, erhalten alle 67198 Benutzer, die dieselbe Seite im selben 15-Sekunden-Fenster aufrufen, denselben Inhalt - alle werden aus dem geschlossenen Cache bereitgestellt. Leistungsgewinn für alle.

Das Hinzufügen von Cache-Control: max-age hat den Vorteil, dass der Browser nicht einmal eine bedingte Anforderung ausführen muss.

  • wenn Sie nur Last-Modified angegeben haben, muss der Browser eine Anforderung If-Modified-Since ausführen und auf eine 304 Not Modified Antwort achten
  • wenn Sie max-age angegeben haben, muss der Browser nicht einmal den Netzwerk-Roundtrip erleiden. Der Inhalt wird direkt aus den Caches kommen

Der Unterschied zwischen "Cache-Control: max-age" und "Expires"

Expires ist ein älteres Äquivalent zum modernen (ca. 1998) Cache-Control: max-age Header:

  • Expires: Sie geben ein Datum an (yuck)
  • max-age: Sie geben Sekunden an (Güte)
  • Und wenn beide angegeben sind, verwendet der Browser max-age:

    200 OK
    Cache-Control: max-age=60
    Expires: 20180403T192837 
    

Jede Website, die nach 1998 geschrieben wurde, sollte nicht mehr Expires, sondern max-age verwenden.

Was ist ETag?

ETag ähnelt Last-Modified , nur dass dies nicht der Fall ist muss ein Datum sein - es muss nur ein etwas sein.

Wenn ich eine Liste von Produkten aus einer Datenbank ziehe, kann der Server anstelle eines Datums das letzte rowversion als ETag senden:

200 OK
ETag: "247986"

Mein ETag kann der SHA1-Hash einer statischen Ressource (z. B. image, js, css, font) oder der zwischengespeicherten gerenderten Seite sein (d. H. Das ist, was das Mozilla MDN-Wiki tut; sie haben das endgültige Markup):

200 OK
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"

Und genau wie bei einer bedingten Anforderung basierend auf Zuletzt geändert :

GET / HTTP/1.1
If-Modified-Since: Tue, 16 Oct 2012 03:13:38 GMT

304 Not Modified

Ich kann eine bedingte Anfrage basierend auf dem ETag ausführen:

GET / HTTP/1.1
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"

304 Not Modified

Ein ETag ist Last-Modified überlegen, da es neben files auch für Dinge funktioniert, die den Begriff date Haben =. Es ist nur ist

52
Ian Boyd
Cache-Control: private

Gibt an, dass die gesamte Antwortnachricht oder ein Teil davon für einen einzelnen Benutzer bestimmt ist und NICHT von einem gemeinsam genutzten Cache, z. B. einem Proxyserver, zwischengespeichert werden darf.

From RFC2616, Abschnitt 14.9.1

163
Dan D.

RFC 2616, Abschnitt 14.9.1 :

Gibt an, dass die gesamte Antwortnachricht oder ein Teil davon für einen einzelnen Benutzer bestimmt ist und NICHT von einem gemeinsam genutzten Cache zwischengespeichert werden darf. Ein privater (nicht gemeinsam genutzter) Cache KANN die Antwort zwischenspeichern.


Browser könnten diese Informationen verwenden. Natürlich kann der aktuelle "Benutzer" viele Bedeutungen haben: Betriebssystembenutzer, Browserbenutzer (z. B. Chrome-Profile) usw. Er ist nicht angegeben.

Für mich ein konkreteres Beispiel für Cache-Control: private ist, dass Proxy-Server (die normalerweise viele Benutzer haben) es nicht zwischenspeichern. Es ist für den Endbenutzer und sonst niemanden bestimmt.


Zu Ihrer Information, der RFC macht klar, dass dies keine Sicherheit bietet. Es geht darum, den richtigen Inhalt anzuzeigen, nicht den Inhalt zu sichern.

Diese Verwendung von Word Private steuert nur, wo die Antwort zwischengespeichert werden kann, und kann die Vertraulichkeit des Nachrichteninhalts nicht gewährleisten.

20
Paul Draper

Das Feld Expires entity-header gibt das Datum und die Uhrzeit an, nach denen die Antwort als veraltet betrachtet wird. Das Feld Cache-control: maxage gibt den Alterswert (in Sekunden) an, der größer ist als die Antwort, die als veraltet betrachtet wird.

Obiges Header-Feld gibt dem Client einen Mechanismus an, um zu entscheiden, ob eine Anfrage an den Server gesendet werden soll. In einigen Fällen sendet der Client eine Anfrage an sever und der Alterwert der Antwort ist größer als der Maximalwert. Bedeutet dies, dass der Server die Ressource an den Client senden muss? Vielleicht hat sich die Ressource nie geändert.

Um dieses Problem zu beheben, gibt HTTP1.1 den zuletzt geänderten Kopf aus. Der Server teilt dem Client das Datum der letzten Änderung der Antwort mit. Wenn der Client diese Ressource benötigt, sendet er das Kopffeld If-Modified-Since an den Server. Wenn dieses Datum vor dem Änderungsdatum der Ressource liegt, sendet der Server die Ressource an den Client und gibt 200 Code zurück. Andernfalls gibt er 304 Code an den Client zurück und dies bedeutet, dass der Client die zwischengespeicherte Ressource verwenden kann.

0
Lin.Yang