Comment prévenir la requête qui retourne 304
Quand un navigateur de ne PAS faire une demande au serveur pour un fichier?
En d'autres termes, j'ai un fichier JavaScript être servi. Sa tête de réponse HTTP est un ETag
, Cache-Control: public
, et Expires: Tue, 19 Jan 2038 03:14:07 GMT
.
Le serveur retourne un 304
après le cache du navigateur a été amorcée.
Ma question est, pourquoi le navigateur même vérifier avec le serveur et l'obtention d'un 304
en premier lieu? Je ne veux pas le navigateur d'aller demander si il y a une nouvelle version, il doit charger directement à partir de la mémoire cache du navigateur sans vérification des modifications avec le serveur de servir le script.
Quelle combinaison d'-têtes de réponse HTTP accomplit cela?
- Qui est le réglage de l'en-tête d'expiration? Selon cette page, l'en-tête d'expiration ne doit pas être plus dans l'avenir de plus d'un an. D'autre part, selon cette page le maximum pris en charge date est
Sun, 17-Jan-2038 19:14:07 GMT since that’s the maximum value supported by the 32 bit Unix time/date format
. Votre date est passé par un couple de jours, peut-être que c'est la raison pour... - le RFC que vous avez lié à est obsolète (note la bannière du haut est tools.ietf.org/html/rfc2616; vous devriez toujours vérifier les Rfc pour l'obsolescence sur tools.ietf.org avant de supposer qu'ils représentent spec actuelle). Cependant, votre point est toujours d'actualité. Alors que la actuellement spec, RFC 7234, a supprimé les conseils contre la fixation des dates d'expiration au-delà de 1 an à l'avenir, il n'avertissent que les dates dans le très lointain avenir devrait être évitée afin d'éviter les débordements.
- Merci pour le pointeur de
tools.ietf.org
, je vais devoir ajouter que, en tant que signet. À propos de l'en-tête expires: je serais surpris si la date a été la cause du problème, mais depuis que je l'ai trouvé, je pensais que je devrais le mentionner...
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, la spécification HTTP est RFC 7234. Si vous regardez la spec, vous pourrez observer deux choses:
Deuxièmement, vous êtes en train de faire rien de mal sur la fin de votre. Les navigateurs sont gratuits en cache des réponses et de l'utilisation de ces mises en cache les réponses les en-têtes que vous êtes de retour. Le point clé est dans Section 4, où il est à noter que l'une des conditions pour servir une réponse en cache, c'est que la réponse est:
Puisque vous êtes en crachant un
Expires
en-tête qui est loin dans le futur, et que l'avenir n'a pas encore été atteint, la réponse est "frais", et, par conséquent, de la revalidation n'est pas nécessaire. Si vous faites tout ce que la spec suggère que vous devriez être sur votre fin. (Bien que l'utilisation deCache-Control: max-age=foo
est une manière plus moderne de la mise en cache délais d'expiration de l'aide de l'Expires:
en-tête.)Donc, si vous voulez changer les navigateurs comportement de mise en cache, vous êtes hors de la chance.
Cependant, les choses pourraient ne pas être aussi mauvais que vous le pensez. Vous êtes probablement seulement être de voir une demande et 304 parce que vous êtes rafraîchissante la page dans votre navigateur lors de l'essai. Les navigateurs gérer la mise en cache des ressources différemment selon la façon dont la demande a été déclenchée.
J'ai couru un test simple dans lequel j'ai créé une page HTML contenant un
<script>
tag pointant vers un fichier JS, un<img>
tag pointant vers une image, et un<link>
tag pointant vers une feuille de style CSS. Tous ces fichiers ont été hébergé sur un serveur Apache configuré pour servir avec:Cache-Control: max-age=172800
en-têteNaturellement, toutes les ressources ont été servis avec 200 codes sur la première page de la charge. Par la suite, des tests sur Chrome ou Firefox, installe le avec les paramètres par défaut, j'ai observé que:
Cette page indique que Internet Explorer a le même comportement:
En d'autres termes, vous êtes habituellement seulement d'aller voir ces revalidation des demandes si le consentement explicite de l'utilisateur actualise la page. Sauf si vous avez une très particulier des exigences sur la façon dont vous voulez que le cache du navigateur de se comporter, ce comportement semble parfaitement raisonnable.
Google et Mozilla à la fois avoir de la documentation sur la mise en cache HTTP (je ne peux pas trouver quelque chose d'équivalent sur MSDN ou le site des Développeurs d'Apple), mais ni suggère l'existence d'un fournisseur spécifique de la mise en cache des en-têtes qui peuvent être utilisés pour modifier les règles d'application, le navigateur utilise de choisir le moment de le revalider. Ce que vous voulez faire est tout simplement pas possible.
Si vous avez réellement besoin de plus de contrôle sur ce comportement, vous pouvez regarder dans le HTML5 Cache de l'Application ou rouler votre propre mise en cache logique en utilisant le Stockage Local HTML5, comme basket.js n'.
Expires:
ouCache-Control: max-age=
devrait fonctionner. Avez-vous vérifié dans les logs du serveur, le navigateur est en fait faire des appels de réseau? J'ai trouvé que firebug, par exemple, a confusion de sortie qui suggère que vous êtes prise de distance des appels lorsque vous êtes réellement frapper le cache.Si vous êtes dans mon bateau et ont Angulaire application déployée à IIS, puis assurez-vous que votre site web.la config est configuré correctement réécrire l'url, comme suit:
Il y a une règle que l'établissement d'un en-tête Expires plus d'un an dans l'avenir viole la HTTP 1.1 RFC.
Ainsi, HTTP en-tête de réponse ici, n'est pas valide (
Expires: Tue, 19 Jan 2038 03:14:07 GMT
). La fixation de ce peut résoudre le problème!