Contrôle du cache IIS7

95

J'essaye de faire quelque chose que je pensais être assez simple. Demandez à IIS 7 d'indiquer aux clients qu'ils peuvent mettre en cache toutes les images de mon site pendant un certain temps, disons 24 heures.

J'ai essayé l'étape 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 toujours des demandes allant au serveur avec des 304 retournés.

Quelqu'un a-t-il un moyen de faire cela? J'ai un site graphiquement intensif et mes utilisateurs sont martelés (mon serveur aussi) chaque fois qu'ils demandent une page. Curieusement, les images semblent avoir "Cache-Control private, max-age = 3600" apparaissant dans Firebug mais le navigateur les demande toujours lorsque j'appuie sur F5.

Chris Meek
la source

Réponses:

124

Si vous souhaitez définir l'en-tête Cache-Control, il n'y a malheureusement rien dans l'interface utilisateur IIS7 pour le faire.

Vous pouvez cependant déposer ce web.config à la racine du dossier ou du site où 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 tous les sous-dossiers.

Vous pouvez également le faire en éditant la métabase IIS7 via appcmd.exe, comme ceci:

\ 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 / dossier par défaut" 
  -section: system.webServer / staticContent 
  -clientCache.cacheControlMaxAge: "7.00: 00: 00"
Jeff Atwood
la source
5
La documentation MSDN pour l'élément de configuration staticContent peut être trouvée ici: msdn.microsoft.com/en-us/library/ms689443.aspx
Milan Gardian
4
Voir les messages 360Airwalk ci-dessous, il y a une interface utilisateur pour cela dans IIS7
ChadT
Juste pour info: ce paramètre semble n'avoir aucun effet sur le serveur de développement intégré (du moins de VS 2010 SP1). En cas de doute sur la raison pour laquelle cela ne fonctionne pas, vérifiez auprès de l'IIS.
6
Salut Jeff, savez-vous comment servir différents en Cache-Control- max-agetêtes ( ) pour différents types mime ou extensions de fichiers?
Jasper
@Jeff Atwood Vous pouvez peut-être m'aider. Regardez ceci: stackoverflow.com/questions/57990579/…
Success Man
115

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 le dossier Application Web par défaut) puis cliquer sur "En-têtes de réponse HTTP". Ensuite, vous devez cliquer sur "Définir l'en-tête commun .." dans le volet de droite et sélectionner "Expirer le contenu Web". Là, vous pouvez facilement configurer un âge maximum de 24 heures en choisissant «Après:», en entrant «24» dans la zone de texte et en choisissant «Heures» dans la zone de liste déroulante.

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

Vous pouvez, bien sûr, réaliser la même chose en fournissant des entrées (ou fichiers) web.config selon vos besoins.

Edit: supprimé une phrase déroutante :)

360Airwalk
la source
1
L'interface utilisateur de ce paramètre est terrible. Mais merci d'avoir expliqué comment y arriver! +1
Billy Coover
Cette interface crée un web.config avec la même configuration que celle publiée par Jeff. Bon à savoir! Merci!
RandyMorris
2
Merci pour le post @ 360Airwalk. Savez-vous comment servir différents en Cache-Control- max-agetêtes ( ) pour différents types mime ou extensions de fichiers?
Jasper
3
@Jasper: vous pouvez le paramétrer par dossier par exemple. si vous définissez le contrôle de cache sur un dossier, les sous-dossiers hériteront du paramètre, mais vous pouvez le remplacer à nouveau et ainsi de suite. vous pouvez même le faire sur une base par fichier. si vous ne pouvez pas accéder à la console iis, vous pouvez également le faire via web.config. voir ce post pour le dernier stackoverflow.com/questions/2195266/…
360Airwalk
27

Je l'utilise

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

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

Elmer
la source
10
La pratique recommandée est de 1 an essentiellement 365 jours pas plus.
Anicho
5
500 jours est une mauvaise chose, que des articles parle d'une narration de règles RFC pour ne pas définir le cache à plus de 1 an developers.google.com/speed/docs/best-practices/caching ne contiendraient pas à plus d'un an à l'avenir , car cela enfreint les directives RFC.
foxontherock
@foxontherock de quelque manière que ce soit vous pourriez prouver que la règle RFC de plus de 365 jours est une mauvaise pratique? Je ne trouve rien pour suggérer cela dans la documentation ...
Paesano2000
@Elmer Vous pouvez peut-être m'aider. Regardez ceci: stackoverflow.com/questions/57990579/…
Success Man
19

L'actualisation F5 a la sémantique «veuillez recharger le 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 HTML également en cours de récupération. Bien sûr, un 304 est une réponse acceptable à cela, mais l'actualisation F5 implique que le navigateur fera 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 en arrière.

Vous pouvez forcer l'actualisation, au-delà d'un 304, en maintenant ctrl tout en appuyant sur f5 dans la plupart des navigateurs.

AnthonyWJones
la source
18

Complétant la réponse d'Elmer, car ma modification a été annulée.

Pour mettre en cache le contenu statique pendant 365 jours avec l'en-tête de contrôle du cache public , 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 celui-ci:

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 les sections 14.9.3 et 14.9.4 de la RFC 2616 . 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 les clients et les serveurs, nous adoptons un maximum recommandé de 365 jours (un an).

Comme mentionné sur d'autres réponses, vous pouvez également utiliser ces directives sur le web.config de votre site pour tout le contenu statique. Vous pouvez également l'utiliser uniquement pour le contenu dans un emplacement spécifique (sur 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>
Luciano Carvalho
la source
Luciano, j'essaye de mettre en cache mes images en utilisant votre méthode. Maintenant, lorsque j'analyse en utilisant HttpFox, je vois 2 demandes faites pour chaque image. 1. La première donne un résultat abandonné avec l'erreur (NS_BINDING_ABORTED) 2. La deuxième demande est une image mise en cache. Des pensées?
Mithil
1

il existe un moyen simple: 1. en utilisant le web.config du site Web 2. dans la section "staticContent" supprimez une extension de fichier 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>
user1401317
la source