web-dev-qa-db-fra.com

Différence entre les en-têtes Pragma et Cache-control?

J'ai lu à propos de Pragma en-tête sur Wikipedia qui dit:

"Le champ d'en-tête Pragma: no-cache est un en-tête HTTP/1.0 destiné à être utilisé dans les requêtes. Il permet au navigateur d'indiquer au serveur et à tous les caches intermédiaires qu'il souhaite une nouvelle version de la ressource, mais pas au serveur. pour indiquer au navigateur de ne pas mettre en cache la ressource. Certains agents utilisateurs font bien attention à cet en-tête dans les réponses, mais la RFC HTTP/1.1 met spécifiquement en garde contre le recours à ce comportement. "

Mais je n'ai pas compris ce que ça fait? Quelle est la différence entre l'en-tête Cache-Control dont la valeur est no-cache et Pragma dont la valeur est également no-cache?

154
saplingPro

Pragma est l'implémentation HTTP/1.0 et cache-control est l'implémentation HTTP/1.1 du même concept. Ils ont tous deux pour but d'empêcher le client de mettre en cache la réponse. Les clients plus anciens peuvent ne pas prendre en charge HTTP/1.1, raison pour laquelle cet en-tête est toujours utilisé.

174
Eric Brenden

Il n'y a pas de différence, sauf que Pragma n'est défini que comme applicable aux requêtes du client, alors que Cache-Control peut être utilisé à la fois par les requêtes des clients et par les réponses des serveurs.

Ainsi, en ce qui concerne les normes, elles ne peuvent être comparées que du point de vue du client qui fait une demande et du serveur qui reçoit une demande du client. Le http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.32 définit le scénario comme suit:

Les caches HTTP/1.1 DEVRAIENT traiter "Pragma: no-cache" comme si le client avait envoyé "Cache-Control: no-cache". Aucune nouvelle directive Pragma ne sera définie dans 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

La façon dont je lisais ce qui précède:

  • si vous écrivez un client et avez besoin de no-cache:

    • utilisez simplement Pragma: no-cache dans vos requêtes, car vous pourriez ne pas savoir si Cache-Control est pris en charge par le serveur;
    • mais dans les réponses, pour décider de mettre en cache ou non, vérifiez Cache-Control
  • si vous écrivez un serveur:

    • dans l'analyse des demandes des clients, recherchez Cache-Control; si non trouvé, recherchez Pragma: no-cache et exécutez la logique Cache-Control: no-cache;
    • dans les réponses, indiquez Cache-Control.

Bien sûr, la réalité peut être différente de ce qui est écrit ou impliqué dans le RFC!

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          |

Si c'est après 1999 et que vous utilisez toujours Expires ou Pragma, vous le faites mal.

Je te regarde 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 est un héritage de HTTP/1.0 et n'est plus nécessaire depuis Internet Explorer 5 ou Netscape 4.7. Sauf si vous vous attendez à ce que certains de vos utilisateurs utilisent IE5: vous pouvez arrêter de l'utiliser en toute sécurité.


  • Expire:[date] (obsolète - HTTP 1.0)
  • Pragma: no-cache (obsolète - HTTP 1.0)
  • Cache-Control: max-age = [seconds]
  • Cache-Control: no-cache (doit valider à nouveau la copie en cache à chaque fois)

Et les demandes conditionnelles:

  • demandes conditionnelles basées sur Etag (balise d'entité)
    • Serveur:Etag: W/“1d2e7–1648e509289”
    • Client:If-None-Match: W/“1d2e7–1648e509289”
    • Serveur:304 Not Modified
  • demandes conditionnelles basées sur la date modifiée
    • Serveur:last-modified: Thu, 09 May 2019 19:15:47 GMT
    • Client:If-Modified-Since: Fri, 13 Jul 2018 10:49:23 GMT
    • Serveur:304 Not Modified

dernière modification: jeu., 09 mai 2019 19:15:47 GMT

9
Ian Boyd