web-dev-qa-db-fra.com

expire les en-têtes et force le chargement du cache au lieu de 304?

Alors voici un petit mystère. Le javascript de Google Analytics se charge toujours du cache du navigateur sur F5 (dans Firefox). Je ne peux pas obtenir la même chose avec mes propres scripts.

Voici les en-têtes qui reviennent sur la demande initiale:

Pour http://google-analytics.com/ga.js:

(Status-Line)           HTTP/1.1 200 OK
Last-Modified           Thu, 16 Feb 2012 00:48:45 GMT
X-Content-Type-Options  nosniff, nosniff
Date                    Thu, 01 Mar 2012 20:58:10 GMT
Expires                 Thu, 01 Mar 2012 22:58:10 GMT
Content-Type            text/javascript
Vary                    Accept-Encoding
Age                     1326
Cache-Control           max-age=7200, public
Server                  GFE/2.0
Transfer-Encoding       chunked
Connection              close

Pour http://my-site.example/myscript.js:

(Status-Line)           HTTP/1.1 200 OK
Server                  nginx
Date                    Thu, 01 Mar 2012 21:20:16 GMT
Content-Type            application/javascript
Last-Modified           Fri, 10 Feb 2012 17:50:27 GMT
Transfer-Encoding       chunked
Connection              keep-alive
Vary                    Accept-Encoding
Expires                 Thu, 01 Mar 2012 23:20:16 GMT
Cache-Control           max-age=7200, public
Content-Encoding        gzip

Quand j'appuie F5 sur ma page, ga.js ne charge que du cache, mais myscript.js est demandé et revient avec 304 Not Modified. Quel est le combo magique ici? Et comment le charger à partir du cache sans déclencher le serveur jusqu'à son expiration?

EDIT
Je n'utilise PAS l'extrait de suivi des stocks de Google. J'utilise le code de chargement suivant:

<script src="/assets/js/vendor/LAB.min.js"></script>
<script>
  $LAB
    .script("//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js").wait()
    .script("/assets/js/common.js?abc123").wait()
    .script("/assets/js/home.js?abc123")
    .script("/assets/js/stats.js?abc123");
</script>

stats.js

// Google Analytics
var _gaq = [["_setAccount", "UA-XXXXXXXX-1"], ["_trackPageview"]];
$LAB.script("//google-analytics.com/ga.js");

// WebSTAT
// ...
5
leeoniya

Sans voir les en-têtes lorsque vous avez rechargé la page, il est un peu difficile de vérifier certaines choses.

Une chose que j’ai remarquée, c’est que les dates/heures ne semblent pas correctes (même s’il s’agit peut-être simplement d’un artefact de la façon dont vous avez copié et collé votre question). La réponse du serveur de Google indique que la Date est Thu, 01 Mar 2012 20:58:10 GMT alors que votre js indique qu'il s'agit de Thu, 01 Mar 2012 21:20:16 GMT. Si ma lecture de cette page est correcte, si votre serveur définit les en-têtes Date futurs de votre machine personnelle, le current_age calculé de votre la copie en cache sera toujours 0 (arrondi à un nombre négatif). Cela ferait en sorte que votre navigateur essaie de le valider en faisant un GET conditionnel qui apparaît sous la forme 304 Not Modified. Google peut aussi être légèrement désynchronisé avec votre ordinateur personnel, mais avec eux l'en-tête Age est utilisé. Il est utilisé lorsqu'il est disponible si la valeur de l'âge calculée est inférieure à celle-ci.

Dans ce cas, assurez-vous que votre serveur Web (et votre ordinateur personnel) synchronisent leur heure sur un serveur de temps Internet. Cherchez un pool de serveurs de temps régional et synchronisez vos machines.

2
webtoe

Le code de Google est appelé à partir de:

<script src="http://www.google-analytics.com/ga.js" type="text/javascript"></script>

Si vous mettez votre code JS dans un fichier et que vous l'appelez de la même manière:

<script src="myscript.js" type="text/javascript"></script>

Votre script sera également mis en cache. Vérifiez le dernier paragraphe ici

0
alfasin

Sur certains navigateurs et dans certaines circonstances (je n'ai pas examiné le code avec suffisamment de détails pour savoir lequel), LABjs utilise différentes méthodes pour précharger les scripts de même domaine et inter-domaines . Il est possible que la méthode de préchargement choisie par LABjs pour les scripts de même domaine soit sous-optimale sur votre navigateur.

Si tel est le cas, vous pouvez le signaler aux développeurs LABjs. (De préférence, après avoir cherché à vérifier qu'il ne s'agit pas déjà d'un problème connu.)

0
Ilmari Karonen