webentwicklung-frage-antwort-db.com.de

Unterschied zwischen Pragma- und Cache-Control-Headern?

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

"Das Feld" Pragma: No-Cache-Header "ist ein HTTP/1.0-Header, der für die Verwendung in Anforderungen vorgesehen ist. Es dient dem Browser dazu, dem Server und allen Zwischen-Caches mitzuteilen, dass eine neue Version der Ressource gewünscht wird, nicht für den Server Einige Benutzerprogramme beachten diesen Header in Antworten, der HTTP/1.1-RFC warnt jedoch ausdrücklich davor, sich auf dieses Verhalten zu verlassen. "

Aber ich habe nicht verstanden, was es tut? Was ist der Unterschied zwischen dem Header Cache-Control, Dessen Wert no-cache Ist, und Pragma, dessen Wert ebenfalls no-cache Ist?

154
saplingPro

Pragma ist die HTTP/1.0-Implementierung und cache-control ist die HTTP/1.1-Implementierung desselben Konzepts. Sie sollen beide verhindern, dass der Client die Antwort zwischenspeichert. Ältere Clients unterstützen HTTP/1.1 möglicherweise nicht, weshalb dieser Header noch verwendet wird.

174
Eric Brenden

Es gibt keinen Unterschied, außer dass Pragma nur für die Anforderungen des Clients definiert ist, während Cache-Control Sowohl für die Anforderungen der Clients als auch für die Antworten der Server verwendet werden kann.

Standardmäßig können sie also nur aus der Perspektive verglichen werden, dass der Client eine Anfrage stellt und der Server eine Anfrage vom Client erhält. Das http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.32 definiert das Szenario wie folgt:

HTTP/1.1-Caches SOLLTEN "Pragma: no-cache" so behandeln, als hätte der Client "Cache-Control: no-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 Client schreiben und no-cache benötigen:

    • verwenden Sie einfach Pragma: no-cache in Ihren Anfragen, da Sie möglicherweise nicht wissen, ob Cache-Control vom Server unterstützt wird.
    • um in den Antworten zu entscheiden, ob zwischengespeichert werden soll, überprüfen Sie, ob Cache-Control
  • wenn Sie einen Server schreiben:

    • prüfen Sie beim Parsen der Anforderungen der Clients, ob Cache-Control; Wenn nicht gefunden, prüfen Sie, ob Pragma: no-cache vorhanden ist, und führen Sie die Logik Cache-Control: no-cache aus.
    • geben Sie in den Antworten Cache-Control ein.

Natürlich könnte die Realität anders aussehen als in der RFC geschrieben oder impliziert!

91
cnst
| 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 schaue 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: Pragma ist ein Erbe von HTTP/1.0 und wird seit Internet Explorer 5 oder Netscape 4.7 nicht mehr benötigt. Wenn Sie nicht erwarten, dass einige Ihrer Benutzer IE5 verwenden, können Sie die Verwendung sicher beenden.


  • Läuft ab:[date] (veraltet - HTTP 1.0)
  • Pragma: no-cache (veraltet - HTTP 1.0)
  • Cache-Kontrolle: max-age = [seconds]
  • Cache-Control: no-cache (muss die zwischengespeicherte Kopie jedes Mal erneut validieren)

Und die bedingten Anfragen:

  • Etag (Entity Tag) -basierte bedingte Anforderungen
    • Server:Etag: W/“1d2e7–1648e509289”
    • Client: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
    • Client: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

9
Ian Boyd