2009-11-23 3 views
4

J'ai un contenu statique sur mon site web pour lequel j'ai configuré la mise en cache (en utilisant Asp.NET MVC). Selon Firebug, la première fois que j'ouvre la page, Firefox envoie cette demande:Pourquoi firefox renvoie-t-il au serveur pour déterminer si mes fichiers sont modifiés?

GET /CoreContent/Core.css?asm=0.7.3614.34951 
Host: 127.0.0.1:3916 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729) 
Accept: text/css,*/*;q=0.1 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 300 
Connection: keep-alive 
Referer: http://127.0.0.1:3916/Edit/1/101 
Cookie: .ASPXAUTH=52312E5A802C1A079E2BA29AA2BFBC5A38058977B84452D62ED52855D4164659B4307661EC73A307BFFB2ED3871C67CB3A9AAFDB3A75A99AC0A21C63A6AADE9A11A7138C672E75125D9FF3EFFBD9BF62 
Pragma: no-cache 
Cache-Control: no-cache 

Que mon serveur répond à cette:

Server: ASP.NET Development Server/9.0.0.0 
Date: Mon, 23 Nov 2009 18:44:41 GMT 
X-AspNet-Version: 2.0.50727 
X-AspNetMvc-Version: 1.0 
Cache-Control: public, max-age=31535671 
Expires: Tue, 23 Nov 2010 18:39:12 GMT 
Last-Modified: Mon, 23 Nov 2009 18:39:12 GMT 
Vary: * 
Content-Type: text/css 
Content-Length: 15006 
Connection: Close 

Jusqu'à présent, si bon. Cependant, si je rafraîchir Firefox (pas un rafraîchissement du cache-compensation, juste une normale un), au cours de ce cycle de rafraîchissement Firefox sera une nouvelle fois sur le serveur avec cette demande:

GET /CoreContent/Core.css?asm=0.7.3614.34951 
Host: 127.0.0.1:3916 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729) 
Accept: text/css,*/*;q=0.1 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 300 
Connection: keep-alive 
Referer: http://127.0.0.1:3916/Edit/1/101 
Cookie: .ASPXAUTH=52312E5A802C1A079E2BA29AA2BFBC5A38058977B84452D62ED52855D4164659B4307661EC73A307BFFB2ED3871C67CB3A9AAFDB3A75A99AC0A21C63A6AADE9A11A7138C672E75125D9FF3EFFBD9BF62 
If-Modified-Since: Mon, 23 Nov 2009 18:39:20 GMT 
Cache-Control: max-age=0 

auquel mon serveur répond 304 Not Modified.

Pourquoi Firefox émet-il cette deuxième requête? Dans la première réponse, j'ai dit que le cache n'expire pas avant un an (j'ai l'intention d'utiliser des paramètres de requête chaque fois que les choses changent). Dois-je ajouter un autre en-tête de réponse pour éviter ce retour supplémentaire?

Modifier: Peu importe que j'appuie sur Actualiser ou que je retourne à la page (ou une URL différente, qui fait référence aux mêmes fichiers externes). Firefox fait de même. Aussi, je ne prétends pas que ce soit un bug dans FF, je me demande juste s'il y a un autre en-tête que je peux définir qui signifie "Ce document ne changera jamais, ne me dérange pas encore".

+0

J'ai remarqué Cache-Control: pas de cache et Cache-Control: pas de cache: max-age = 0 en-têtes dans les requêtes GET. Peut-être que c'est le problème? Selon http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html: Lorsqu'un client essaie de revalider une entrée de cache et que la réponse qu'il reçoit contient un en-tête Date qui semble être plus ancien que l'un Pour l'entrée existante, le client DEVRAIT répéter la demande sans condition, et inclure Cache-Control: max-age = 0 ... – Roman

+0

Merci, mais ces en-têtes sont envoyés par FF. La question est de savoir s'il y a quelque chose que je peux faire sur le serveur pour me dire "Fais-moi confiance, ce fichier ne changera jamais, s'il te plaît, ne me dérange plus." – erikkallen

+0

Puis-je vous demander pourquoi vous ne mentionnez que FireFox mais pas les autres navigateurs? Avez-vous résolu le problème décrit avec ces autres navigateurs ou vous vous en fichez du tout? Vraiment dire que je suis également intéressé par ce comportement "cache forever", s'il existe. Merci. – Roman

Répondre

0

Apparemment, le problème était dû à l'ajout d'un en-tête Vary: * à la réponse. Pour supprimer ce dans Asp.Net, ajoutez ceci à web.config dans la section <system.web>:

<caching> 
    <outputCache omitVaryStar="true"/> 
</caching> 

Pour moi, il semble que ce commutateur est « oui, je veux un comportement de travail plutôt qu'un non-travail un », mais une fois que vous le trouvez, le renverser est trivial.

1

Ce comportement semble être "par conception" pour tous les navigateurs modernes. Dans IE, vous pouvez étudier la même situation. Frapper F5 provoque toujours le navigateur pour vérifier si le contenu a été modifié. Pendant l'effacement de cache, ne passez pas l'en-tête Last-Modified et le serveur doit renvoyer HTTP 200 (pas HTTP 304), donc 304 dans votre situation n'est pas si mauvais.

+0

Il n'y a donc aucun moyen pour le serveur de dire "Ce fichier ne changera jamais, ne me dérangez plus à ce sujet si vous n'en avez absolument pas besoin"? – erikkallen

+0

Je ne suis pas sûr à 100%, surtout à propos de tous les navigateurs, mais d'après ma propre expérience, je pense que la réponse est "pas du tout". Si l'utilisateur ne frappe pas le navigateur F5 utilise la version en cache. Conseil principal: ne pas oublier les en-têtes HTTP Last-Modified et ETag pour le cas où l'utilisateur touche F5, car sinon le contenu statique sera rechargé, ce qui est beaucoup plus cher que la réponse 304. – Roman