Pour répondre à la question, il y a deux joueurs ici, le client (demande) et le serveur (réponse).
Client:
Le client ne peut demander qu'avec une méthode de cache. Il existe différentes méthodes et si ce n'est pas spécifié, l'utilisera default
.
- défaut: Inspectez le cache du navigateur:
- S'il est mis en cache et « frais »: retour du cache.
- S'il est mis en cache, périmé, mais toujours « valide »: retournez du cache, et planifiez une récupération pour mettre à jour le cache (pour la prochaine utilisation).
- Si cache et périmé: récupérez avec des conditions, cache et retour.
- Si ce n'est pas mis en cache: récupérez, cache et retour.
- pas de magasin: Récupérer et retourner.
- recharger: Récupérer, cache et retour. (par défaut-4)
- Pas de chache: Inspectez le cache du navigateur:
- Si Cached: récupérez avec des conditions, cache et retour. (par défaut-3)
- Si ce n'est pas mis en cache: récupérez, cache et retour. (par défaut-4)
- cache de force: Inspectez le cache du navigateur:
- Si en cache: retournez-le malgré son rassis.
- Si ce n'est pas le cache: récupérer, cache et retour. (par défaut-4)
- uniquement en cache: Inspectez le cache du navigateur:
- Si en cache: retournez-le malgré son rassis.
- Si ce n'est pas mis en cache: jetez l'erreur de réseau.
Notes:
- Toujours « valide » signifie le courant
age
est à l'intérieur dustale-while-revalidate
durée de vie. Il a besoin de « revalidation », mais est toujours acceptable pour revenir. - « Fetch » ici, pour la simplicité, est court pour « Fetch de réseau non conditionnel ».
- « Récupérer avec des conditions » signifie aller chercher à utiliser des en-têtes comme
If-Modified-Since
ouETag
afin que le serveur puisse répondre avec304: (Not Modified)
.
https://fetch.spe.whatwg.org/#concept-request-cache-mode
Serveur::
Maintenant que nous comprenons ce que le client peut faire, les réponses du serveur ont plus de sens. En regardant le Cache-Control
En-tête, si le serveur revient:
- pas de magasin: Dit au client de ne pas utiliser du tout du cache
- Pas de chache: Dit au client qu'il doit faire des demandes conditionnelles et ignorer la fraîcheur
- maximum: Dit à client combien de temps un cache est « frais »
- rassis à réévalider: Indique au client combien de temps le cache est « valide »
- immuable: Cache pour toujours
Maintenant, nous pouvons tout rassembler. Cela signifie que les seules possibilités sont:
- Réseau non conditionnel Réparger
- Réseau conditionnel Réponction
- Retour cache
- Retourner cache et valide
- Retourner le cache frais
- Retourner n'importe quel cache
Toute combinaison de client ou de serveur peut dicter la méthode, ou l'ensemble des méthodes, à utiliser. Si le serveur revient no-store
cela ne va pas frapper le cache, quel que soit le type de demande du client. Si la demande du client était no-store
peu importe ce que le serveur renvoie, il ne se cache pas. Si le client ne spécifie pas de type de demande, le serveur le dictera avec Cache-Control
.
Il n'a aucun sens qu'un serveur revienne les deux no-cache
et no-store
depuis no-store
Overtient tout. Oui, vous avez probablement vu les deux ensemble, et il est inutile en dehors des implémentations de navigateur cassé. Toujours, no-store
fait partie des spécifications depuis 1999: https://datatracker.ietf.org/doc/html/rfc2616#section-14.9.2
Dans l'utilisation réelle, si votre serveur prend en charge 304: Not Modified
et vous souhaitez utiliser le cache client comme moyen d'améliorer la vitesse, mais que vous souhaitez toujours forcer un réseau, utiliser no-cache
. Si ne supporte pas 304
et je veux forcer un réseau récupérer, utiliser no-store
. Si vous êtes parfois d'accord avec le cache, utilisez des en-têtes de fraîcheur et de revalidation.
En réalité, si vous mélangez no-cache
et no-store
Sur le client, très peu changerait. Ensuite, seulement quelques en-têtes sont envoyés et il y aura différentes réponses internes gérées par le navigateur. Un problème peut se produire si vous utilisez no-cache
Et puis oubliez de l'utiliser plus tard. no-cache
Il lui dit de stocker la réponse dans le cache, et une demande ultérieure sans qu'elle puisse déclencher un cache interne.
Il y a des moments où vous voudrez peut-être mélanger les méthodes même sur la même ressource en fonction du contexte. Par exemple, vous voudrez peut-être utiliser reload
sur un employé de service et une synchronisation des antécédents, mais utilisez default
pour la page Web elle-même. C'est là que vous pouvez manipuler le cache d'agent utilisateur (navigateur) à votre goût. N'oubliez pas que le serveur a généralement le dernier mot sur le fonctionnement du cache.
Pour clarifier une possible confusion future. Le client peut utiliser le Cache-Control
en-tête sur le demandepour dire au serveur de ne pas utiliser son propre système de cache lors de la réponse. Ce n'est pas lié à la dynamique du navigateur / serveur, et plus sur la dynamique du serveur / base de données.
Aussi no-store
Techniquement, cela ne doit pas stocker à aucun stockage non volatile (disque) et le libérer à partir du stockage volatil (mémoire) dès que possible. En pratique, cela signifie que n'utilisez pas du tout de cache. La commande va en fait dans les deux sens. Une demande du client avec no-store
ne devrait pas écrire sur le disque ou la base de données et est destiné à transit.
TL; DR: no-store
surclassement no-cache
. Définir les deux est inutile, sauf si nous parlons des navigateurs hors spécification ou HTTP / 1.0 qui ne prennent pas en charge no-store
(Peut-être IE11?). Utiliser no-cache
pour 304
soutien.