2009-06-25 6 views
19

Je suis dans une situation où mon serveur Web (embarqué) envoie l'en-tête Expires, mais le navigateur ne semble pas respecter le paramètre d'en-tête, c'est-à-dire si j'actualise la page, le navigateur demande les ressources censées être mises en cache. Voici les en-têtes qui s'échangés:HTTP Expire en-tête non respecté par le navigateur?

 
https://192.168.1.180/scgi-bin/ajax/ajax.cgi 

GET /scgi-bin/ajax/ajax.cgi HTTP/1.1 
Host: 192.168.1.180 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11 (.NET CLR 3.5.30729) 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
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 
Cache-Control: max-age=0 

HTTP/1.x 200 OK 
Date: Wed, 24 Jun 2009 20:26:47 GMT 
Server: Embedded HTTP Server. 
Connection: close 
Content-Type: text/html 
---------------------------------------------------------- 
https://192.168.1.180/scgi-bin/ajax/static.cgi?fn=images/logo.jpg&ts=20090624201057 

GET /scgi-bin/ajax/static.cgi?fn=images/logo.jpg&ts=20090624201057 HTTP/1.1 
Host: 192.168.1.180 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11 (.NET CLR 3.5.30729) 
Accept: image/png,image/*;q=0.8,*/*;q=0.5 
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: https://192.168.1.180/scgi-bin/ajax/ajax.cgi 
Cache-Control: max-age=0 

HTTP/1.x 200 OK 
Date: Wed, 24 Jun 2009 20:26:47 GMT 
Server: Embedded HTTP Server. 
Connection: close 
Expires: Wed, 1 Jun 2011 20:00:00 GMT 
Content-Type: image/jpg 
---------------------------------------------------------- 

Le ajax.cgi retourne une page html avec un logo graphique (via le script static.cgi), que je voudrais mises en cache, mais le navigateur demande de le logo sur chaque rafraîchissement.

+0

Je vois que vous travaillez sur HTTPS. Est-ce que cela pourrait être la raison pour laquelle aucune mise en cache n'est faite comme prévu? Pouvez-vous essayer une version HTTP uniquement? – mark

Répondre

13

Que faites-vous dans votre navigateur? J'ai l'impression que vous cliquez sur le bouton de rechargement ou même quelque chose comme shift + Reload. Normalement, le navigateur n'envoie pas d'en-tête Cache-Control: max-age=0. Cela signifie que le navigateur a jeté l'image en cache et veut l'obtenir à nouveau.

Si vous venez de naviguer vers une autre page, puis revenir, le navigateur doit respecter votre en-tête Expires.

En outre, vous pouvez ajouter un en-tête Cache-control: public à votre réponse. Cela permet aux proxys et au navigateur de mettre explicitement en cache l'image.

+1

Cela semble juste. Le navigateur (Firefox?) Envoie max-age = 0, ce qui signifie qu'il ne veut pas de réponse plus ancienne que 0s, c'est-à-dire qu'il veut frapper le serveur web d'origine. C'est la définition de "refresh". Naviguez loin de votre page, puis collez à nouveau l'URL et voyez ce qui se passe. –

+0

En effet, je faisais un rechargement de page, et je m'attendais à ce que le navigateur recharge le html mais pas toutes les ressources mises en cache aussi. Je pensais que vous deviez faire Maj-clic (ou Ctrl-clic? Ne me souviens pas) pour forcer le navigateur à invalider le cache sur toutes les ressources. Je suppose que ma compréhension est incorrecte? – user128602

+0

Je ne suis pas sûr à ce sujet non plus. Je pense que les navigateurs se comportent différemment sur le bouton F5/Reload avec/sans Shift. – chris166

0

Le script CGI ressemble à un paramètre d'horodatage ... cela ne change pas, n'est-ce pas? Le navigateur doit traiter chaque URL unique comme un objet différent dans le cache. Par conséquent, si cette dernière est mise à jour à chaque requête, elle ne correspondra pas à l'image mise en cache.

En outre, le champ Expires n'est pas exactement au format RFC 1123, car vous avez besoin de deux chiffres pour la date. Cela peut ou peut ne pas être un problème, mais c'est quelque chose à vérifier. Le navigateur inclut Cache-Control: max-age=0, ce qui indique qu'il considère son cache comme potentiellement obsolète. Une fois que le serveur a reçu cette demande de validation, il peut renvoyer 304 (Not Modified) ou 200 (OK) comme il le fait actuellement.

+0

Non, l'horodatage ne change pas. Et merci pour le conseil sur le format de date Expires, je vais vérifier. – user128602

16

Le navigateur ignore l'en-tête Expires si vous actualisez la page. Il vérifie toujours si l'entrée de cache est toujours valide en contactant le serveur Web. Idéalement, il utilisera l'en-tête de demande If-Modified-Since pour que le serveur puisse renvoyer '304 Non modifié' si l'entrée de cache est toujours valide.

Vous ne définissez pas l'en-tête Last-Modified, de sorte que le navigateur doit effectuer un GET inconditionnel du contenu pour s'assurer qu'il est à jour.

Quelques règles de base pour le réglage et Expires dernière modification sont décrites dans ce billet de blog:

http://blog.httpwatch.com/2007/12/10/two-simple-rules-for-http-caching/

+3

"Le navigateur ignore l'en-tête Expires si vous actualisez la page." Je vous remercie! Je ne le savais pas. –

+2

Quel navigateur fait cela? – Pacerier

0

Toute erreur dans votre certificat https causeront le navigateur respecte pas vos têtes. Essayez-le sans https et voyez si cela fonctionne sur http simple.

Voir cette réponse https://stackoverflow.com/a/17716911

Questions connexes