Różnica między nagłówkami Pragma i Cache-Control?


166

Czytałem o nagłówku Pragma na Wikipedii, który mówi:

„Pole nagłówka Pragma: no-cache to nagłówek HTTP / 1.0 przeznaczony do użycia w żądaniach. Jest to sposób, w jaki przeglądarka informuje serwer i wszelkie pośrednie pamięci podręczne, że potrzebuje nowej wersji zasobu, a nie dla serwera nakazać przeglądarce, aby nie buforowała zasobu. Niektóre programy użytkownika zwracają uwagę na ten nagłówek w odpowiedziach, ale protokół HTTP / 1.1 RFC wyraźnie ostrzega przed poleganiem na tym zachowaniu. "

Ale nie rozumiem, co to robi? Jaka jest różnica między Cache-Controlnagłówkiem, którego wartość jest, no-cachea Pragmaktórego wartością jest również no-cache?

Odpowiedzi:


196

Pragmajest implementacją HTTP / 1.0 i cache-controljest implementacją HTTP / 1.1 tej samej koncepcji. Oba mają na celu zapobieżenie buforowaniu odpowiedzi przez klienta. Starsi klienci mogą nie obsługiwać protokołu HTTP / 1.1, dlatego ten nagłówek jest nadal używany.


31
Chociaż odpowiedź cnst poniżej jest znacznie bardziej skomplikowana, jest również znacznie bardziej poprawna zgodnie ze specyfikacją. Pragma: no-cachema być używany tylko w żądaniach (co oznacza „Chcę mieć oryginał, a nie kopię w pamięci podręcznej”), a jego zachowanie nie jest określone dla odpowiedzi.
klimat

5
Cache-Control: no-cachema to samo znaczenie dla żądań, ale w rzeczywistości jest również zdefiniowane dla odpowiedzi, co oznacza „Jeśli chcesz użyć kopii tego z pamięci podręcznej w przyszłości, musisz najpierw sprawdzić ze mną, czy jest aktualna (tj. przeprowadzić weryfikację)”.
klimat

3
Służy do kontroli pamięci podręcznej, nie musi to być TYLKO do zapobiegania pamięci podręcznej, można go również użyć do powiedzenia „Możesz to zapisać w pamięci podręcznej”. ....
jave.web

Podstawowa odpowiedź. Aby było to bardziej skomplikowane: jest to również nagłówek żądania, co oznacza, że ​​możesz również wysłać plik no-cache do serwera. A to faktycznie może oznaczać zwrócenie klientom nieaktualnej zawartości. CO? Teraz o tym zapomnij i przeczytaj powyższą prostą odpowiedź i ciesz się życiem, nie
kopaj

Oba mają na celu zapobieganie buforowaniu odpowiedzi przez klienta, co jest mylącą uwagą dla czytelników. Może również mieć to, max-ageco nie zapobiega buforowaniu. Po prostu ustawia datę ważności ...
Kochanie,

97

Nie ma żadnej różnicy, z wyjątkiem tego, że Pragmajest zdefiniowany tylko jako mający zastosowanie do żądań klienta, podczas gdy Cache-Controlmoże być używany zarówno przez żądania klientów, jak i odpowiedzi serwerów.

Tak więc, jeśli chodzi o standardy, można je porównać tylko z punktu widzenia klienta składającego żądanie i serwera otrzymującego żądanie od klienta. Http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.32 definiuje w następujący scenariusz:

Bufory HTTP / 1.1 POWINNY traktować „Pragma: no-cache” tak, jakby klient wysłał „Cache-Control: no-cache”. Żadne nowe dyrektywy Pragmy nie zostaną zdefiniowane w HTTP.

  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

Tak bym przeczytał powyższe:

  • jeśli piszesz do klienta i potrzebujesz no-cache:

    • po prostu używaj Pragma: no-cachew swoich żądaniach, ponieważ możesz nie wiedzieć, czy Cache-Controljest obsługiwany przez serwer;
    • ale w odpowiedziach, aby zdecydować, czy buforować, sprawdź Cache-Control
  • jeśli piszesz serwer:

    • podczas analizowania żądań od klientów sprawdź Cache-Control; jeśli nie zostanie znaleziony, sprawdź Pragma: no-cachei wykonaj Cache-Control: no-cachelogikę;
    • w odpowiedziach podać Cache-Control.

Oczywiście rzeczywistość może różnić się od tego, co jest napisane lub domniemane w specyfikacji RFC!


5
A co, jeśli nagłówek ma oba? Cache-Control: max-age=86400i Pragma: no-cache? Który z nich zostanie wówczas uhonorowany przez współczesne przeglądarki?
PKHunter

3
@PKHunter, dlaczego miałbyś obchodzić, w którą stronę pójdzie, jeśli zachowanie jest nieokreślone? Jeśli odpowiadasz za serwer, możesz zrobić coś lepszego niż przekazywanie klientowi wprowadzających w błąd informacji. Ponadto, jak wskazałem w mojej odpowiedzi, Pragma: no-cachejest on zdefiniowany tylko dla żądań z przeglądarki, a zatem byłby całkowicie nieważny i niezdefiniowany w odpowiedziach z serwera do przeglądarki, np. Wyobrażałbym sobie, że każda przeglądarka (nowoczesna lub nie) powinien ignorować taki nagłówek w każdej otrzymanej odpowiedzi.
cnst

3
Nowoczesna przeglądarka powinna ignorować Pragmę na rzecz kontroli pamięci podręcznej, jeśli obie są obecne, ponieważ ta ostatnia może określać okresy i inne informacje, które nie były dostępne w początkowym protokole 1.0.
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          |

Jeśli jest po 1999 roku i nadal używasz Expires lub Pragma , robisz to źle.

Patrzę na Ciebie 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: Pragmajest starszą wersją protokołu HTTP / 1.0 i nie był potrzebny od Internet Explorera 5 lub Netscape 4.7. Chyba że spodziewasz się, że niektórzy użytkownicy będą używać IE5: możesz bezpiecznie przestać go używać.


  • Wygasa: [date] (przestarzałe - HTTP 1.0)
  • Pragma: no-cache (przestarzałe - HTTP 1.0)
  • Cache-Control: max-age =[seconds]
  • Cache-Control: no-cache (za każdym razem należy ponownie zweryfikować kopię z pamięci podręcznej)

Oraz żądania warunkowe:

  • Żądania warunkowe oparte na Etag (znaczniku encji)
    • Serwer: Etag: W/“1d2e7–1648e509289”
    • Klient: If-None-Match: W/“1d2e7–1648e509289”
    • Serwer: 304 Not Modified
  • Zmodyfikowane żądania warunkowe oparte na dacie
    • Serwer: last-modified: Thu, 09 May 2019 19:15:47 GMT
    • Klient: If-Modified-Since: Fri, 13 Jul 2018 10:49:23 GMT
    • Serwer: 304 Not Modified

ostatnia modyfikacja: czw., 09 maja 2019 19:15:47 GMT


2
Dokument RFC mówi, że powinieneś używać ich obu, jeśli klient nie obsługuje kontroli pamięci podręcznej: tools.ietf.org/html/rfc7234#page-29
Randall Borck

3
Klient „powinien” obejmują zarówno - o ile nie chce się leczyć serwerów HTTP / 1.1 i HTTP / 1.0 buforowania inaczej. Serwer nie powinien w ogóle zawierać Pragma. (W HTTP / 1.0 Pragma została zdefiniowana jako rozszerzalne pole dla dyrektyw określonych w implementacji dla odbiorców. Ta specyfikacja wycofuje takie rozszerzenia w celu poprawy współdziałania).
Ian Boyd

2
Z punktu widzenia bezpieczeństwa zaleca się jego używanie. Wiele przeglądarek przestrzega dyrektywy pragma: no-cache, więc zaleca się jej używanie przez OWASP: owasp.org/index.php/ ...
Randall Borck

2
@RandallBorck: Rozpowszechniasz przestarzałe (nie mniej o dwie dekady!) Informacje. Żadna przeglądarka nie przestrzega już dyrektywy Pragmy, chyba że jest rok 1999. Oto rada kultu cargo: „to nie boli i zawsze to robiliśmy, dlatego jest to dobre i konieczne”.
Piskvor opuścił budynek

2
@Piskvor Większość serwerów nadal obsługuje zarówno 1.0, jak i 1.1, więc jeśli nie blokujesz aktywnie żądań HTTP / 1.0, nie wybierasz protokołu, którego używa klient. Większość deweloperów dzisiaj nie zawraca sobie głowy blokowaniem 1.0, dlatego nadal jest to najlepsza praktyka, nawet w 2019 roku.
Randall Borck
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.