Unterschied zwischen Pragma- und Cache-Control-Headern?

166

Ich habe über den Pragma- Header auf Wikipedia gelesen, der besagt:

"Das Pragma: No-Cache-Header-Feld ist ein HTTP / 1.0-Header, der zur Verwendung in Anforderungen vorgesehen ist. Es ist ein Mittel für den Browser, dem Server und allen Zwischen-Caches mitzuteilen, dass er eine neue Version der Ressource möchte, nicht für den Server Einige Benutzeragenten achten in Antworten auf diesen Header, aber der HTTP / 1.1-RFC warnt ausdrücklich davor, sich auf dieses Verhalten zu verlassen. "

Aber ich habe nicht verstanden, was es tut? Was ist der Unterschied zwischen dem Cache-ControlHeader, dessen Wert ist no-cacheund Pragmadessen Wert auch ist no-cache?

saplingPro
quelle

Antworten:

196

Pragmaist die HTTP / 1.0-Implementierung und cache-controlist die HTTP / 1.1-Implementierung desselben Konzepts. Beide sollen verhindern, dass der Client die Antwort zwischenspeichert. Ältere Clients unterstützen möglicherweise kein HTTP / 1.1, weshalb dieser Header weiterhin verwendet wird.

Eric Brenden
quelle
31
Obwohl die Antwort von cnst unten viel komplizierter ist, ist sie gemäß der Spezifikation auch viel korrekter. Pragma: no-cacheist nur für Anfragen vorgesehen (dh "Ich möchte das Original, keine zwischengespeicherte Kopie"), und sein Verhalten ist für Antworten nicht angegeben.
Klima
5
Cache-Control: no-cachehat die gleiche Bedeutung für Anfragen, ist aber auch für Antworten definiert. Dies bedeutet "Wenn Sie in Zukunft eine zwischengespeicherte Kopie davon verwenden möchten, müssen Sie zuerst bei mir überprüfen, ob sie aktuell ist (dh eine erneute Validierung durchführen)".
Klima
3
Es dient der Cache-Steuerung und muss nicht NUR zur Verhinderung des Caches verwendet werden. Es kann auch verwendet werden, um zu sagen, dass Sie dies zwischenspeichern können. ....
jave.web
Grundlegende Antwort. Um es komplizierter zu machen: Es ist auch ein Anforderungsheader, was bedeutet, dass Sie auch keinen Cache an den Server senden können. Und das könnte tatsächlich bedeuten, veraltete Inhalte an die Kunden zurückzugeben, WAS? Jetzt vergisst du das und liest die obige einfache Antwort und genießt dein Leben, grabe es nicht zu hart lol
sotn
Beide sollen verhindern, dass der Client die Antwort zwischenspeichert. Dies ist eine verwirrende Notiz für die Leser. Es kann auch haben, max-agewas das Caching nicht verhindert. Es legt nur ein Ablaufdatum dafür fest ...
Honey
97

Es gibt keinen Unterschied, außer dass dies Pragmanur für die Anforderungen des Clients gilt, während Cache-Controles sowohl von den Anforderungen der Clients als auch von den Antworten der Server verwendet werden kann.

Was Standards betrifft, können sie nur aus der Sicht des Clients verglichen werden, der eine Anfrage stellt, und des Servers, der eine Anfrage vom Client empfängt. Die http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.32 definiert das Szenario wie folgt:

HTTP / 1.1-Caches sollten "Pragma: kein Cache" so behandeln, als hätte der Client "Cache-Control: kein Cache" gesendet. In HTTP werden keine neuen Pragma-Direktiven definiert.

  Note: because the meaning of "Pragma: no-cache as a response
  header field is not actually specified, it does not provide a
  reliable replacement for "Cache-Control: no-cache" in a response

So würde ich das oben lesen:

  • Wenn Sie einen Kunden schreiben und Folgendes benötigen no-cache:

    • Verwenden Pragma: no-cacheSie es einfach in Ihren Anfragen, da Sie möglicherweise nicht wissen, ob Cache-Controles vom Server unterstützt wird.
    • Um zu entscheiden, ob zwischengespeichert werden soll, überprüfen Sie in den Antworten, ob Cache-Control
  • Wenn Sie einen Server schreiben:

    • Überprüfen Sie beim Parsen von Anforderungen von den Clients auf Cache-Control; Wenn nicht gefunden, suchen Sie nach Pragma: no-cacheder Cache-Control: no-cacheLogik und führen Sie sie aus .
    • in Antworten angeben Cache-Control.

Natürlich kann die Realität anders sein als im RFC geschrieben oder impliziert!

cnst
quelle
5
Was ist, wenn der Header beide enthält? Cache-Control: max-age=86400und Pragma: no-cache? Welcher wird dann von den modernen Browsern geehrt?
PKHunter
3
@PKHunter, warum sollte es dich interessieren, in welche Richtung es geht, wenn das Verhalten undefiniert ist? Wenn Sie für den Server verantwortlich sind, können Sie dies eindeutig besser tun, als irreführende Informationen an den Client weiterzugeben. Wie in meiner Antwort erwähnt, Pragma: no-cacheist das nur für Anfragen vom Browser definiert, und es wäre daher völlig ungültig und undefiniert in Antworten vom Server an den Browser, z. B. würde ich mir vorstellen, dass jeder einzelne Browser (ob modern oder modern) not) sollte einen solchen Header in jeder Antwort ignorieren, die er möglicherweise erhält.
21.
3
Ein moderner Browser sollte das Pragma zugunsten der Cache-Steuerung ignorieren, wenn beide vorhanden sind, da letzterer Zeiträume und andere Informationen angeben kann, die im ursprünglichen 1.0-Protokoll nicht verfügbar waren.
Randall Borck
17
| Stop using          | Replaced with                    |
| (HTTP 1.0)          | (HTTP 1.1 - 1999)                |
|---------------------|----------------------------------|
| Expires: [date]     | Cache-Control: max-age=[seconds] |
| Pragma: no-cache    | Cache-Control: no-cache          |

Wenn es nach 1999 ist und Sie immer noch Expires oder Pragma verwenden , machen Sie es falsch.

Ich sehe dich an Stackoverflow:

200 OK
Pragma: no-cache
Content-Type: application/json
X-Frame-Options: SAMEORIGIN
X-Request-Guid: a3433194-4a03-4206-91ea-6a40f9bfd824
Strict-Transport-Security: max-age=15552000
Content-Length: 54
Accept-Ranges: bytes
Date: Tue, 03 Apr 2018 19:03:12 GMT
Via: 1.1 varnish
Connection: keep-alive
X-Served-By: cache-yyz8333-YYZ
X-Cache: MISS
X-Cache-Hits: 0
X-Timer: S1522782193.766958,VS0,VE30
Vary: Fastly-SSL
X-DNS-Prefetch-Control: off
Cache-Control: private

tl; dr: Pragmaist ein Erbe von HTTP / 1.0 und wurde seit Internet Explorer 5 oder Netscape 4.7 nicht mehr benötigt. Es sei denn, Sie erwarten, dass einige Ihrer Benutzer IE5 verwenden: Es ist sicher, die Verwendung zu beenden.


  • Läuft ab: [date] (veraltet - HTTP 1.0)
  • Pragma: kein Cache (veraltet - HTTP 1.0)
  • Cache-Kontrolle: maximales Alter =[seconds]
  • Cache-Kontrolle: kein Cache (muss die zwischengespeicherte Kopie jedes Mal neu validieren)

Und die bedingten Anfragen:

  • Etag (Entity Tag) -basierte bedingte Anforderungen
    • Server: Etag: W/“1d2e7–1648e509289”
    • Klient: If-None-Match: W/“1d2e7–1648e509289”
    • Server: 304 Not Modified
  • Geänderte datumsbasierte bedingte Anforderungen
    • Server: last-modified: Thu, 09 May 2019 19:15:47 GMT
    • Klient: If-Modified-Since: Fri, 13 Jul 2018 10:49:23 GMT
    • Server: 304 Not Modified

Letzte Änderung: Do, 09. Mai 2019 19:15:47 GMT

Ian Boyd
quelle
2
Der RFC sagt, dass Sie beide verwenden sollten, falls ein Client Cache-Control nicht unterstützt: tools.ietf.org/html/rfc7234#page-29
Randall Borck
3
Der Client sollte beides enthalten - es sei denn, er möchte die HTTP / 1.1- und HTTP / 1.0-Caching-Server unterschiedlich behandeln. Der Server sollte überhaupt nicht enthalten Pragma. (In HTTP / 1.0 wurde Pragma als erweiterbares Feld für implementierungsspezifische Anweisungen für Empfänger definiert. Diese Spezifikation lehnt solche Erweiterungen ab, um die Interoperabilität zu verbessern.)
Ian Boyd
2
Aus Sicherheitsgründen wird empfohlen, es zu verwenden. Viele Browser folgen der Pragma: No-Cache-Direktive, daher wird empfohlen, sie von OWASP zu verwenden: owasp.org/index.php/…
Randall Borck
2
@ RandallBorck: Sie verbreiten veraltete (nicht weniger als zwei Jahrzehnte!) Informationen. Kein Browser folgt mehr der Pragma-Richtlinie, es sei denn, es ist 1999. Dies ist ein Ratschlag für den Frachtkult: "Es tut nicht weh und wir haben es immer getan, deshalb ist es gut und notwendig."
Piskvor verließ das Gebäude am
2
@Piskvor Die meisten Server unterstützen weiterhin sowohl 1.0 als auch 1.1. Wenn Sie also HTTP / 1.0-Anforderungen nicht aktiv blockieren, wählen Sie nicht aus, welches Protokoll der Client verwendet. Die meisten Entwickler machen sich heute nicht die Mühe, 1.0 zu blockieren, daher ist es auch 2019 noch eine bewährte Methode.
Randall Borck