2017-02-22 4 views
0

j'utilisais le code HTML meta balises pour désactiver le cache jusqu'à ce que j'appris que cela ne fonctionne que si le fichier est servi sur place, donc je désactivé le cache grâce à l'utilisation recommandée des en-têtes en mettant ce en haut de mes pages:La désactivation du cache de pages ne désactive pas la mise en cache des ressources.

header("Cache-Control: no-cache, no-store, must-revalidate"); 
header("Pragma: no-cache"); 
header("Expires: 0"); 

Ce que je ne trouve pas de réponse et il peut être stupide de demander, mais cela ne désactive pas les ressources de la mise en cache non plus, n'est-ce pas? J'étais dans mes outils de développement et je regardais l'onglet réseau et j'ai remarqué que la page était toujours chargée, mais des ressources telles que CSS et Javascript étaient encore en train de charger à partir du cache, ce qui me laisse penser que empêcher les ressources de la page d'être mis en cache, mais je ne sais pas si c'est vrai. Donc, ce que je faisais était ajouter un peu de versionnage aux ressources comme ceci:

<link rel="stylesheet" href="css/style.css?version=1"> 

qui a arrêté la ressource d'être mises en cache, ce qui est ce que je voulais, mais après avoir lu un peu plus, il semble que les en-têtes supplémentaires peuvent être utilisés pour cibler certains formats de fichiers et les empêcher d'être également mis en cache, ce qui donnerait les mêmes résultats que la gestion des versions, bien que d'une manière différente.

Est-ce que ma compréhension de cela est correcte et/ou les méthodes de mélange sont-elles une mauvaise pratique?

+0

Peut-être que vous mettez en cache au niveau du serveur Web? Dans IIS vous avez cette option, presque sûr d'autres aussi – Oscar

+2

pour appache: http://httpd.apache.org/docs/current/mod/mod_expires.html – nogad

Répondre

1

Vos observations et votre compréhension sont correctes. Lorsque vous définissez des en-têtes de mise en cache dans votre php, par exemple, ils ne sont valides que pour cette page. Regardez à partir d'un point de navigateur de vue:

  • page Demande - recevoir une réponse avec des instructions de ne pas mettre en cache
  • Parse a reçu la page, obtenir URIs des ressources (css, js, img, etc.)
  • Envoyer demande de chacune de ces ressources - recevoir une réponse

Si dans cette dernière réponse, il n'y a pas de têtes indiquant au navigateur de ne pas les mettre en cache, ils seront mis en mémoire cache selon les règles standard.

Il existe plusieurs façons d'empêcher la mise en cache. L'un est exactement ce que vous décrivez, c'est-à-dire que vous ajoutez un paramètre en constante évolution à l'URI demandé - de cette façon, chaque fois qu'il est demandé, il est demandé avec un paramètre différent. Il serait toujours mis en cache, mais la requête suivante ne correspondrait pas à celle-ci et le cache ne serait pas utilisé.

Une autre consiste à modifier la configuration de votre serveur Web pour indiquer que certains types de ressources (noms de fichiers, extensions, types de contenu, etc.) ne doivent pas être mis en cache. Par exemple, les éléments suivants dans la configuration Apache indique qu'aucune mise en cache doit se produire à tout pour tous les fichiers:

<Files *> 
    Header set Cache-Control: "private, pre-check=0, post-check=0, max-age=0" 
    Header set Expires: 0 
    Header set Pragma: no-cache 
</Files> 

Prenez note que l'idée de la mise en cache est double:

  • permettent aux clients d'obtenir des réponses plus rapide en utilisant copie locale précédemment téléchargée d'une ressource
  • plus la charge sur votre serveur en ayant moins de réponses à servir

donc ne soyez CAREF ul avec désactiver la mise en cache. Vous pouvez (dans le cas extrême) finir par tuer votre serveur si vous sous-estimez sérieusement le nombre de requêtes que vous devez gérer.

+0

Merci pour le point de vue du navigateur, qui m'a fait comprendre. Je ne suis pas sûr pourquoi je pensais que les instructions initiales de ne pas mettre en cache couler vers le bas pour tout le reste dans la page, mais maintenant je comprends! – Slime

+1

juste pour ajouter même si vous faites cela, les fichiers pourraient toujours être mis en cache à divers endroits tels que votre FAI. – nogad

+0

@nogad correct. Certains proxys peuvent ignorer ou même supprimer les en-têtes de mise en cache. –