92 votes

Contrôle du cache

Je suis en train de faire quelque chose qui me semblait être assez simple. Obtenir IIS 7 de dire aux clients qu'ils peuvent mettre en cache toutes les images sur mon site pour un certain laps de temps, disons que 24 heures.

J'ai essayé le pas sur http://www.galcho.com/Blog/post/2008/02/27/IIS7-How-to-set-cache-control-for-static-content.aspx mais en vain. Je reçois encore des demandes d'aller sur le serveur avec 304s d'être renvoyé.

Quelqu'un aurait-il un moyen de le faire? J'ai un graphiques du site et de mes utilisateurs sont martelées (donc mon serveur) chaque fois qu'ils demande une page. Wierdly les images semblent avoir "Cache-Control private,max-age=3600" qui apparaissent dans Firebug, mais le navigateur est encore de leur demander quand j'appuie sur F5.

122voto

Jeff Atwood Points 31111

Si vous souhaitez définir l'entête Cache-Control, il n'y a rien dans le IIS7 de l'INTERFACE utilisateur pour ce faire, malheureusement.

Vous pouvez toutefois déposer ce web.config à la racine du dossier ou du site où vous voulez en faire:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <staticContent>
      <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="7.00:00:00" />
    </staticContent>
  </system.webServer>
</configuration>

Qui en informera le client en cache de contenu pour 7 jours dans ce dossier et tous les sous-dossiers.

Vous pouvez également le faire en modifiant le IIS7 métabase via appcmd.exe, comme suit:

\Windows\system32\inetsrv\appcmd.exe 
 set config "Site Web par Défaut/dossier" 
 -section:système.webServer/staticContent 
-clientCache.cacheControlMode:UseMaxAge

\Windows\system32\inetsrv\appcmd.exe 
 set config "Site Web par Défaut/dossier" 
 -section:système.webServer/staticContent 
-clientCache.cacheControlMaxAge:"7.00:00:00"

114voto

360Airwalk Points 1319

Ce n'est pas vrai Jeff.

Il vous suffit de sélectionner un dossier au sein de votre Gestionnaire IIS 7 de l'INTERFACE utilisateur (par exemple, des Images ou de l'événement par Défaut le dossier de l'Application Web), puis cliquez sur "en-Têtes de Réponse HTTP". Ensuite, vous devez cliquer sur l'en-Tête Commun.." dans le volet de droite et sélectionnez l'option "Expiration de contenu Web". De là, vous pouvez facilement configurer une durée de vie maximale de 24 heures en choisissant "Après:", d'entrer dans "24" dans la zone de texte et choisissez "Heures" dans la zone de liste déroulante.

Votre premier paragraphe concernant le web.config entrée est à droite. J'ajouterais la cacheControlCustom-attribut pour définir le contrôle de cache-tête "public" ou tout ce qui est nécessaire dans ce cas.

Vous pouvez, bien sûr, d'atteindre le même en fournissant web.config entrées (ou des fichiers).

Edit: suppression d'une source de confusion phrase :)

26voto

Elmer Points 2377

Je l'utilise

 <staticContent>
<clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="500.00:00:00" />
</staticContent>
 

mettre en cache le contenu statique pendant 500 jours avec un en-tête public de contrôle du cache.

19voto

AnthonyWJones Points 122520

Le F5 Actualiser a la sémantique de "s'il vous plaît recharger le HTML en cours ET en direct de dépendances". Donc vous attendre à voir de toute les dim, css et js de ressources directement référencé par le HTML aussi refetched. Bien sûr, un 304 est une réponse acceptable à cette mais F5 actualiser implique que le navigateur va faire la demande plutôt que de compter sur les frais de cache de contenu.

Au lieu d'essayer simplement de naviguer ailleurs et ensuite de naviguer de nouveau.

Vous pouvez forcer le rafraîchissement, passé un 304, en maintenant la touche ctrl tout en appuyant sur la touche f5 dans la plupart des navigateurs.

18voto

Luciano Carvalho Points 807

En complément d'Elmer réponse, comme mon montage a été annulée.

Pour mettre en cache le contenu statique pour 365 jours avec le public-tête cache-control, IIS peut être configuré comme suit

<staticContent>
    <clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="365.00:00:00" />
</staticContent>

Ceci se traduira par un en-tête comme ceci:

Cache-Control: public,max-age=31536000

Notez que max-age est un delta en quelques secondes, d'être exprimé par un effet positif de 32 bits entier comme indiqué dans la RFC 2616 Sections 14.9.3 et 14.9.4. Cela représente une valeur maximale de 2^31 ou 2,147,483,648 secondes (plus de 68 ans). Cependant, pour mieux s'assurer de la compatibilité entre les clients et les serveurs, nous adoptons un maximum recommandé de 365 jours (un an).

Comme mentionné dans d'autres réponses, vous pouvez utiliser ces directives sur le web.config de votre site pour tous les contenus statiques. Comme alternative, vous pouvez l'utiliser seulement pour le contenu dans un emplacement spécifique (sur l'exemple, 30 jours public de cache pour le contenu de "$ ca" dossier):

<location path="cdn">
   <system.webServer>
        <staticContent>
             <clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="30.00:00:00"/>
        </staticContent>
   </system.webServer>
</location>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X