Comment faire arrêter la mise en cache du navigateur GWT nocache.js

Je suis le développement d'une application web en utilisant GWT et je vois un fou problème avec la mise en cache de la app.nocache.js fichier dans le navigateur, même si le serveur web a envoyé une nouvelle copie du fichier!

J'utilise Eclipse pour compiler l'application, qui fonctionne en dev mode. Pour tester le mode de production, j'ai une machine virtuelle (Oracle VirtualBox) avec un Ubuntu OS invité en cours d'exécution sur mon ordinateur hôte (Windows 7). Je fais tourner le serveur web lighttpd dans la machine virtuelle. La VM est le partage de mon projet de guerre du répertoire, et le serveur web est au service de cette dir.

Je suis en utilisant google Chrome comme navigateur, mais la même chose se passe dans Firefox.

Voici le scénario:

  • La page web de l'application est vide. Accorind à Chrome "Inspecter l'Élément", c'est parce qu'il est en train d'essayer d'extraction 6E89D5C912DD8F3F806083C8AA626B83.cache.html, qui n'existe pas (404 not found).
  • - Je vérifier la guerre répertoire, et bien sûr, ce fichier n'existe pas.
  • La app.nocache.js sur le navigateur a ÉTÉ RECHARGÉ à partir du serveur web (200 OK), car le fichier sur le serveur est plus récent que le cache du navigateur. J'ai vérifié que la taille du fichier et la date pour le nouveau fichier renvoyé par le serveur sont corrects. (C'est de l'info Chrome rapports sur le serveur HTTP de la réponse)
  • Cependant, si j'ouvre la app.nocache.js sur le navigateur, le javascript est en se référant à 6E89D5C912DD8F3F806083C8AA626B83.cache.html!!! Qui est, même si le serveur web envoyer un nouveau app.nocache.js, le navigateur semble avoir ignoré que et maintenu à l'aide de sa copie mise en cache!

  • Goto Google->GWT Compiler dans Eclipse. Recompiler le tout.

  • Vérifier dans la guerre répertoire que le app.nocache.js a été écrasé et a un nouveau timestamp.
  • Recharger la page à partir de Chrome et vérifier encore une fois que le serveur a envoyé une réponse 200 OK pour la app.nocache.js.
  • Le navigateur tente une fois de plus à charge 6E89D5C912DD8F3F806083C8AA626B83.cache.html et échoue. Le navigateur utilise encore l'ancienne copie mise en cache de app.nocache.js.
  • Fait absolument certain dans la guerre répertoire que rien n'est en se référant à 6E89D5C912DD8F3F806083C8AA626B83.cache.html (via find et grep)

Ce qui ne va pas? Pourquoi la mise en cache du navigateur ce nocache.js fichier, même si le serveur est de l'envoyer une nouvelle copie?


Voici une copie de la requête HTTP/en-têtes de réponse lorsque vous cliquez sur recharger dans le navigateur. Dans cette trace, le serveur de contenu n'a pas été recompilé depuis le dernier GET (mais notez que la version en cache d'nocache.js est toujours mal!):

Request URL:http://192.168.2.4/xbts_ui/xbts_ui.nocache.js
Request Method:GET
Status Code:304 Not Modified
Request Headersview source
Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Host:192.168.2.4
If-Modified-Since:Thu, 25 Oct 2012 17:55:26 GMT
If-None-Match:"2881105249"
Referer:http://192.168.2.4/XBTS_ui.html
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4
Response Headersview source
Accept-Ranges:bytes
Content-Type:text/javascript
Date:Thu, 25 Oct 2012 20:27:55 GMT
ETag:"2881105249"
Last-Modified:Thu, 25 Oct 2012 17:55:26 GMT
Server:lighttpd/1.4.31
BTW, cela semble similaire au stackoverflow.com/questions/3407649/... mais il ne contient pas toutes les informations qui m'ont aidé à résoudre ce problème.
Avez-vous lu, developers.google.com/web-toolkit/doc/latest/... ?
Oui, et il semble que la chose se passe, parce que la page dit "if-Modified-since fetch est suffisant". Je peux dire à partir de Chrome Inspecter l'Élément de l'outil que le navigateur a envoyé "if-Modified-since:Thu, 25 Oct 2012 17:03:53 GMT" dans la demande, et le serveur a répondu avec "Last-Modified:Thu, 25 Oct 2012 17:55:26 GMT"
Ajout d'une requête/réponse HTTP en-tête de trace pour que cela soit plus clair pour les potentiels des aides.
Je suis penser que le problème est que le navigateur effectue une estimation sur la durée de fraîcheur de la nocache.js fichier, et de déterminer le fichier est encore "frais". C'est à partir de la lecture de la spécification RFC HTTP section 13.2.4: "Si aucun n'arrive à Expiration, Cache-Control: max-age, ou Cache-Control: s - maxage (voir l'article 14.9.3) apparaît dans la réponse, et la réponse ne comporte pas d'autres restrictions sur la mise en cache, le cache PEUT calculer une durée de fraîcheur à l'aide d'une heuristique." (à partir de w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13)

OriginalL'auteur jfritz42 | 2012-10-25