web-dev-qa-db-fra.com

Le navigateur Chrome n'envoie pas d'en-tête if-modified-Since depuis au serveur.

J'ai ces en-têtes envoyés au client par le serveur:

Cache-Control:private
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html
Date:Sun, 27 Nov 2011 11:10:38 GMT
ETag:"12341234"
Set-Cookie:connect.sid=e1u...7o; path=/; expires=Sun, 27 Nov 2011 11:40:38 GMT; httpOnly
Transfer-Encoding:chunked
last-modified:Sat, 26 Nov 2011 21:42:45 GMT

Je veux que le client valide que le fichier n'a pas changé sur le serveur et envoie un "200" s'il a sinon un "304".

Firefox envoie:

if-modified-since: Sat, 26 Nov 2011 21:42:45 GMT
if-none-match: "12341234"

Pourquoi le chrome n'envoie-t-il pas le même message lors d'une actualisation de la page? Je suis après le comportement que .Net a en cours d'exécution:

context.Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate)
39
Asken

D'après mon expérience, vous avez besoin de plus que l'en-tête "privé" Cache-Control. Vous devez utiliser "Max-Age" ou "Expires" pour obliger Chrome à revalider le contenu sur le serveur. 

N'oubliez pas que la revalidation ne commencera qu'une fois ces valeurs de temps écoulées; il peut donc être nécessaire de les définir sur une valeur faible.

11
Andy McCluggage

Après avoir passé une demi-journée à ce sujet hier, j'ai repéré la cause du problème pour moi. Tant que l'inspecteur d'objets Chrome/le débogueur client/le moniteur réseau/l'élément affiché apparaît lorsque vous appuyez sur la touche F12, Chrome n'envoie pas les en-têtes de requête de cache. Période. (mise à jour: dans les versions plus récentes de Chrome, la case "Désactiver le cache" est cochée). Même si l'onglet "Réseau" n'est pas ouvert (ex: si vous avez la console javascript ouverte), cette case à cocher désactive tout le cache.

C'est dommage, car le débogage côté client oblige à laisser le panneau de réseau ouvert pour voir quels en-têtes sont envoyés et reçus et quels codes sont renvoyés. Sans le panneau de réseau ouvert, il est impossible de savoir si votre contenu est mis en cache du côté client. 

Si vous creusez dans les journaux d'accès au serveur, vous remarquerez que votre serveur renvoie 304 (contenu mis en cache) à la minute où vous fermez la fenêtre de débogage sur votre client Chrome. J'espère que cela t'aides. 

Chrome 24.0.1312.57

57
Mark

J'ai trouvé une réponse à ce problème lors de l'utilisation de HTTPS, pensant partager ce que j'ai trouvé. Vous ne spécifiez pas si vous demandez via HTTP ou HTTPS.

"La règle est en fait assez simple: toute erreur avec le certificat signifie que la page ne sera pas mise en cache."

https://code.google.com/p/chromium/issues/detail?id=110649

Si vous utilisez un certificat auto-signé, même si vous indiquez à Chrome de lui ajouter une exception afin que la page soit chargée, aucune ressource de cette page ne sera mise en cache et les demandes suivantes ne comporteront pas d'en-tête If-Modified-Since.

29
Neek

En outre ( https://stackoverflow.com/a/14899869/362780 ):

F12> Paramètres> Général> Désactiver le cache (lorsque DevTools est ouvert) -> décochez cette case ...

4
K-Gun

Les navigateurs ont beaucoup de comportements contre-intuitifs en matière de mise en cache. Vous vous attendriez à ce que, si la réponse inclut une date de dernière modification, le navigateur la revalide avant de la réutiliser. Mais aucun des principaux navigateurs ne le fait réellement.

Les paramètres idéaux pour votre situation dépendent du moment où vous souhaitez que le navigateur se revalide, voir le lien ci-dessous.

Non seulement les navigateurs agissent de manière intuitive, mais différents navigateurs se comportent également différemment dans la même situation. Par exemple, lorsque l'utilisateur clique sur le bouton d'actualisation.

Vous pouvez lire comment les différents navigateurs (Internet Explorer, Edge, Safari, FireFox, Chrome) se comportent avec différentes directives de mise en cache (Etag, dernière modification, must-revalidate, expire, max-age, sans cache ni réserve) https://gertjans.home.xs4all.nl/javascript/cache-control.html

0
Gert-Jan

Je sais que cette question est ancienne, mais quand même ... J'ai remarqué que Chrome se souvenait du dernier rafraîchissement que vous avez effectué. Ainsi, si vous appuyez sur ctrl + shift + r (actualisation et suppression du cache) et que vous appuyez sur ctrl + r (actualisation uniquement), chrome continue de supprimer le cache et ne montre pas le 304 dans la réponse reçue. Il existe une solution de contournement pour cela. Appuyez sur ctrl + shift + r puis allez dans la barre d’adresse, faites la mise au point et appuyez sur entrée. Si vos etags sont définis correctement et que votre serveur est prêt à servir un serveur 304, vous verrez un nouveau code de réponse dans le débogueur - 304. Cela fonctionnera donc.

0
M K