web-dev-qa-db-fra.com

Contrôle de cache IIS7

J'essaie de faire quelque chose que je pensais être assez simple. Obtenez IIS 7 pour dire aux clients qu’ils peuvent mettre en cache toutes les images de mon site pendant un certain laps de temps, par exemple 24 heures.

J'ai essayé l'étape sur http://www.galcho.com/Blog/post/2008/02/27/IIS7-How-towset-cache-control-for-static-content.aspx mais en vain. Je reçois toujours des demandes qui vont au serveur avec 304 en retour.

Est-ce que quelqu'un a un moyen de faire ça? J'ai un site graphique intensif et mes utilisateurs (ainsi que mon serveur) sont martelés chaque fois qu'ils demandent une page. Plus étrangement, les images semblent contenir "Cache-Control private, max-age = 3600" dans Firebug, mais le navigateur les demande toujours lorsque j'appuie sur F5.

90
Chris Meek

Si vous souhaitez définir l'en-tête Cache-Control, l'interface utilisateur de IIS7 ne permet malheureusement pas de le faire.

Vous pouvez toutefois déposer ce fichier web.config à la racine du dossier ou du site sur lequel vous souhaitez le définir:

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

Cela informera le client de mettre en cache le contenu pendant 7 jours dans ce dossier et dans tous les sous-dossiers.

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

\Windows\system32\inetsrv\appcmd.exe 
 Set config "Site Web/dossier par défaut" 
 -Section: system.webServer/staticContent 
 -ClientCache. cacheControlMode: UseMaxAge 
 
\Windows\system32\inetsrv\appcmd.exe 
 set config "Site Web par défaut/dossier" 
 -section: system.webServer/staticContent 
 -clientCache.cacheControlMaxAge: "7h00: 00h00" 
119
Jeff Atwood

Ce n'est pas vrai Jeff.

Vous devez simplement sélectionner un dossier dans votre IIS 7 Manager UI (par exemple, Images ou événement dans le dossier Application Web par défaut), puis cliquer sur "En-têtes de réponse HTTP". Ensuite, vous devez cliquer sur "Set Common Header .." dans le volet de droite et sélectionner le "Contenu Web Expire". Là, vous pouvez facilement configurer un maximum de 24 heures en choisissant "Après:", en entrant "24" dans la zone de texte et en choisissant "Heures" dans la liste déroulante.

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

Bien entendu, vous pouvez obtenir le même résultat en fournissant des entrées (ou des fichiers) web.config selon vos besoins.

Edit: enlevé une phrase déroutante :)

112
360Airwalk

Je l'utilise

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

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

25
Elmer

Le F5 Refresh a la sémantique de "veuillez recharger le code HTML actuel ET ses dépendances directes". Par conséquent, vous devriez vous attendre à voir toutes les ressources imgs, css et js directement référencées par le code HTML également extraites. Bien sûr, un 304 est une réponse acceptable à cela, mais l'actualisation F5 implique que le navigateur fasse la demande plutôt que de s'appuyer sur un nouveau contenu de cache.

Au lieu de cela, essayez simplement de naviguer ailleurs puis de revenir.

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

19
AnthonyWJones

Pour compléter la réponse d'Elmer, mon édition a été annulée.

Pour mettre en cache le contenu statique pendant 365 jours avec un en-tête public de contrôle du cache , IIS peut être configuré avec les éléments suivants:

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

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

Cache-Control: public,max-age=31536000

Notez que max-age est un delta en secondes, exprimé par un entier positif de 32 bits, comme indiqué dans 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 (sur 68 ans). Cependant, pour mieux assurer la compatibilité entre clients et serveurs, nous adoptons un maximum recommandé de 365 jours (un an).

Comme indiqué dans d'autres réponses, vous pouvez également utiliser ces directives sur le fichier Web.config de votre site pour tous les contenus statiques. En guise d'alternative, vous pouvez également l'utiliser uniquement pour le contenu d'un emplacement spécifique (dans l'exemple, cache public de 30 jours pour le contenu du dossier "cdn" ):

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

il existe un moyen simple: 1. d'utiliser le fichier Web.config du site Web 2. dans la section "staticContent", supprimez fileExtension spécifique et ajoutez mimeMap 3. ajoutez "clientCache"

<configuration>
  <system.webServer>
    <urlCompression doStaticCompression="true" doDynamicCompression="true" />
    <staticContent>
      <remove fileExtension=".ipa" />
      <remove fileExtension=".apk" />
      <mimeMap fileExtension=".ipa" mimeType="application/iphone" />
      <mimeMap fileExtension=".apk" mimeType="application/vnd.Android.package-archive" />
      <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="777.00:00:00" />
    </staticContent>
  </system.webServer>
</configuration>
0
user1401317