Mon problème est: parfois, le navigateur sur-cache certaines ressources même si je les ai déjà modifiées. Mais après la F5, tout va bien.
J'ai étudié ce cas toute l'après-midi. Maintenant, j'ai complètement compris le point de "Last-Modified" ou "Cache-Control". Et je sais comment résoudre mon issue (seulement .js? Version ou explicitement max-age = xxxx). Mais le problème n'est toujours pas résolu: comment le navigateur gère-t-il l'en-tête de la réponse sans "Cache-Control" comme ceci:
Content-Length: 49675
Content-Type: text/html
Last-Modified: Thu, 27 Dec 2012 03:03:50 GMT
Accept-Ranges: bytes
Etag: "0af7fcbdee3cd1:972"
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Date: Thu, 24 Jan 2013 07:46:16 GMT
Ils les cachent clairement quand "Entrez dans le bar"
RFC 7234 détaille ce que les navigateurs et les mandataires doivent faire par défaut:
Bien que la mise en cache soit une fonctionnalité entièrement OPTIONNELLE de HTTP, elle peut être supposé que la réutilisation d’une réponse en cache est souhaitable et que tel réutiliser est le comportement par défaut quand aucune exigence ou local la configuration l’empêche. Par conséquent, les exigences de cache HTTP sont concentré sur la prévention d'un cache de stocker un non-réutilisable réponse ou de réutiliser une réponse stockée de manière inappropriée, plutôt que exiger que les caches stockent et réutilisent toujours des réponses particulières.
La mise en cache est généralement activée par défaut dans browers. Vous pouvez donc utiliser cache-control
pour personnaliser ce comportement ou le désactiver.
Bien que la mise en cache soit une fonctionnalité entièrement OPTIONNELLE de HTTP, on peut supposer que la réutilisation d'une réponse en cache est souhaitable et que cette réutilisation constitue le comportement par défaut lorsqu'aucune exigence ou configuration locale ne l'en empêche. Par conséquent, les exigences en matière de cache HTTP visent principalement à empêcher un cache de stocker une réponse non réutilisable ou de réutiliser une réponse stockée de manière inappropriée, plutôt que d'imposer que les caches stockent et réutilisent toujours des réponses particulières. [ https://tools.ietf.org/html/rfc7234#section-2]
L'heure à laquelle le navigateur considère qu'une réponse en cache est récente est généralement relative à la date de la dernière modification:
Etant donné que les serveurs Origin ne fournissent pas toujours des heures d’expiration explicites, un cache PEUT affecter une heure d’expiration heuristique lorsqu’aucune heure explicite n’est spécifiée, en utilisant des algorithmes utilisant d’autres valeurs de champ d’en-tête (comme l’heure de la dernière modification) ... a un champ d’en-tête Last-Modified (paragraphe 2.2 de la [RFC7232]), les caches sont encouragés à utiliser une valeur d’expiration heuristique ne dépassant pas une fraction de l’intervalle écoulé depuis ce moment. Un réglage typique de cette fraction pourrait être 10%. [ https://tools.ietf.org/html/rfc7234#section-4.2.2]
Cet article contient des détails sur la manière dont les différents navigateurs calculent cette valeur.
L'en-tête de contrôle du cache par défaut est: Private
Un mécanisme de cache peut mettre cette page en cache dans un cache privé et la renvoyer uniquement à un seul client. Ceci est la valeur par défault. La plupart des serveurs proxy ne mettront pas les pages en cache avec ce paramètre.
Veuillez consulter http://msdn.Microsoft.com/en-us/library/ms524721%28v=vs.90%29.aspx
La durée de vie de la fraîcheur est calculée en fonction de plusieurs en-têtes. Si un en-tête "Cache-control: max-age = N" est spécifié, la durée de vie de la fraîcheur est égale à N. Si cet en-tête n'est pas présent, ce qui est très souvent le cas, il est vérifié si un en-tête Expires est présent. Si un en-tête Expires existe, sa valeur moins la valeur de l'en-tête Date détermine la durée de vie de la fraîcheur. Enfin, si aucun en-tête n'est présent, recherchez un en-tête Last-Modified. Si cet en-tête est présent, la durée de vie de la fraîcheur du cache est égale à la valeur de l'en-tête Date moins la valeur de l'en-tête Dernière modification divisée par 10.
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Caching_FAQ
Sans l'en-tête de contrôle du cache, le navigateur demande la ressource chaque fois qu'il charge une nouvelle page (?). Si vous appuyez sur F5, vous invalidez (ou même supprimez logiquement) tout élément mis en cache dans cette page, ce qui force le rechargement complet en ne disposant pas de version locale. Je ne sais pas si le navigateur supprime ces ressources du cache avant de les redemander.
La partie amusante est qu’il existe des paramètres «supplémentaires» dans certains navigateurs qui entraînent certaines optimisations, telles que la demande d’une ressource une seule fois par chargement de page. Si vous avez une image qui change pour chaque requête comme un compteur, vous ne verrez qu'une version de cette image, même si vous l'utilisez plusieurs fois.
La prochaine est que le navigateur réutilise des images qui ne sont pas explicitement définies comme nocache en appliquant une sorte de cache local "préféré". Si vous voulez avoir une demande à chaque fois, vous devez la définir pour revalider et définir expired à -1 ou à quelque chose du genre.
Donc, selon la ressource ne spécifiant rien, déclenchent souvent des valeurs par défaut qui ne sont pas identiques à celles attendues de la lecture des spécifications.
Il peut également y avoir un comportement différent selon que la source semble être locale, un lecteur ou un vrai serveur Internet distant. Tous les navigateurs n'agissent pas différemment et je suis assez limité.
Ce qui est utile, c'est de consulter www.google.com et de rechercher le pixel de suivi de leurs demandes de page (deux pixels de 1x1 demandés à metrics.gstats.com avec une partie aléatoire sur le sous-domaine).
Si vous utilisez firebug pour extraire l'en-tête, vous constatez qu'ils spécifient les directives nocache de toutes les manières possibles. L'en-tête se lit comme ceci:
Alternate-Protocol 443:quic
Cache-Control no-cache, must-revalidate
Content-Length 35
Content-Type image/gif
Date Mon, 25 Nov 2013 14:33:30 GMT
Expires Fri, 01 Jan 1990 00:00:00 GMT
Last-Modified Tue, 14 Aug 2012 10:47:46 GMT
Pragma no-cache
Server sffe
X-Content-Type-Options nosniff
X-Firefox-Spdy 3
X-XSS-Protection 1; mode=block
Essayez ceci comme paramètre et vérifiez si cela résout le problème selon lequel le navigateur n'a pas récupéré vos ressources modifiées. La directive must-revalidate obligera même les caches de proxy à demander une ressource à chaque fois et à rechercher 304 réponses non modifiées.
Je vis actuellement quelque chose de similaire. J'ai une connexion localhost paramétrant l'etag et tout ce qui se passe est que le cache ne demande jamais. Je n'ai pas mis d'information de mise en cache ou similaire. Seul en spécifiant un joint etag pour empêcher FireFox de demander à nouveau la ressource. Je ressens donc quelque chose de similaire à votre problème.