wake-up-neo.net

IIS7 Cache-Control

Ich versuche etwas zu tun, von dem ich dachte, dass es ziemlich einfach wäre. Holen Sie sich IIS 7, um den Kunden mitzuteilen, dass sie alle Bilder auf meiner Site für eine bestimmte Zeit im Cache speichern können, sagen wir 24 Stunden.

Ich habe den Schritt versucht auf http://www.galcho.com/Blog/post/2008/02/27/IIS7-How-to-set-cache-control-for-static-content.aspx aber ohne Erfolg. Ich erhalte weiterhin Anfragen an den Server, wenn 304s zurückgegeben werden.

Hat jemand eine Möglichkeit, dies zu tun? Ich habe eine grafisch intensive Site und meine Benutzer werden jedes Mal, wenn sie eine Seite anfordern, gehämmert (ebenso mein Server). Seltsamerweise scheint auf den Bildern "Cache-Control private, max-age = 3600" in Firebug zu erscheinen, aber der Browser fordert sie immer noch an, wenn ich F5 drücke.

90
Chris Meek

Wenn Sie den Cache-Control-Header festlegen möchten, gibt es in der IIS7-Benutzeroberfläche leider keine Möglichkeit, dies zu tun.

Sie können diese web.config jedoch im Stammverzeichnis des Ordners oder der Site ablegen, in dem Sie sie festlegen möchten:

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

Dadurch wird der Client angewiesen, den Inhalt für 7 Tage in diesem Ordner und allen Unterordnern zwischenzuspeichern.

Sie können dies auch tun, indem Sie die IIS7-Metabasis mit appcmd.exe Wie folgt bearbeiten:

\Windows\system32\inetsrv\appcmd.exe 
 Set config "Standardwebsite/-ordner" 
 - Abschnitt: system.webServer/staticContent 
 -ClientCache. cacheControlMode: UseMaxAge 
 
\Windows\system32\inetsrv\appcmd.exe 
 set config "Standardwebsite/-ordner" 
 - Abschnitt: system.webServer/staticContent 
 -clientCache.cacheControlMaxAge: "7.00: 00: 00" 
119
Jeff Atwood

Das ist nicht wahr, Jeff.

Sie müssen lediglich einen Ordner in Ihrer IIS 7 Manager-Benutzeroberfläche (z. B. Bilder oder den Standardordner für Webanwendungen) auswählen und dann auf "HTTP-Antwortheader" klicken. Dann müssen Sie auf " Set Common Header .. "im rechten Bereich und wählen Sie" Expire Web Content ". Dort können Sie ganz einfach ein Höchstalter von 24 Stunden konfigurieren, indem Sie" After: "wählen," 24 "in das Textfeld eingeben und" Hours "auswählen. in der Combobox.

Ihr erster Absatz bezüglich des Eintrags web.config ist richtig. Ich würde das cacheControlCustom-Attribut hinzufügen, um den Cache-Steuerelement-Header auf "public" zu setzen, oder was auch immer in diesem Fall benötigt wird.

Sie können dies natürlich auch erreichen, indem Sie bei Bedarf web.config-Einträge (oder -Dateien) bereitstellen.

Edit: Einen verwirrenden Satz entfernt :)

112
360Airwalk

Ich benutze das

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

zum Zwischenspeichern von statischem Inhalt für 500 Tage mit öffentlichem Cache-Control-Header.

25
Elmer

Die F5-Aktualisierung hat die Semantik "Bitte laden Sie das aktuelle HTML neu UND seine direkten Abhängigkeiten". Daher sollten Sie damit rechnen, dass alle imgs-, css- und js -Ressourcen, auf die der HTML-Code direkt verweist, ebenfalls neu abgerufen werden. Natürlich ist ein 304 eine akzeptable Antwort darauf, aber F5-Aktualisierung impliziert, dass der Browser die Anfrage stellt, anstatt sich auf neuen Cache-Inhalt zu verlassen.

Versuchen Sie stattdessen einfach, woanders zu navigieren und dann zurück zu navigieren.

Sie können die Aktualisierung nach einem 304 erzwingen, indem Sie die Strg-Taste gedrückt halten und in den meisten Browsern F5 drücken.

19
AnthonyWJones

Ergänzt Elmers Antwort, da meine Bearbeitung zurückgesetzt wurde.

Um statischen Inhalt für 365 Tage mit dem öffentlichen Cache-Steuerungsheader zwischenzuspeichern, kann IIS) wie folgt konfiguriert werden

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

Dies wird in einen Header wie diesen übersetzt:

Cache-Control: public,max-age=31536000

Beachten Sie, dass das maximale Alter ein Delta in Sekunden ist, ausgedrückt durch eine positive 32-Bit-Ganzzahl, wie in RFC 2616, Abschnitte 14.9.3 und 14.9.4 angegeben. Dies entspricht einem Maximalwert von 2 ^ 31 oder 2.147.483.648 Sekunden (über 68 Jahre). Um jedoch eine bessere Kompatibilität zwischen Clients und Servern zu gewährleisten, wird ein Maximum von 365 Tagen (ein Jahr) empfohlen.

Wie in anderen Antworten erwähnt, können Sie diese Anweisungen auch in der web.config Ihrer Site für alle statischen Inhalte verwenden. Alternativ können Sie es auch nur für Inhalte an einem bestimmten Ort verwenden (im Beispiel 30 Tage öffentlicher Cache für Inhalte im Ordner "cdn") ):

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

es gibt eine einfache Möglichkeit: 1. Verwenden Sie die web.config-Datei der Website. 2. Entfernen Sie im Abschnitt "staticContent" eine bestimmte fileExtension und fügen Sie mimeMap hinzu. 3. Fügen Sie "clientCache" hinzu.

<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