IIS7-Cache-Steuerung

95

Ich versuche etwas zu tun, was ich für ziemlich einfach hielt. Lassen Sie IIS 7 den Clients mitteilen, dass sie alle Bilder auf meiner Website für einen bestimmten Zeitraum zwischenspeichern können, beispielsweise 24 Stunden.

Ich habe den Schritt auf http://www.galcho.com/Blog/post/2008/02/27/IIS7-How-to-set-cache-control-for-static-content.aspx versucht, aber ohne Erfolg. Ich erhalte immer noch Anfragen an den Server, wobei 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 wie mein Server). Seltsamerweise scheinen die Bilder "Cache-Control privat, maximales Alter = 3600" in Firebug zu haben, aber der Browser fordert sie immer noch an, wenn ich F5 drücke.

Chris Meek
quelle

Antworten:

124

Wenn Sie den Cache-Control-Header festlegen möchten, gibt es in der IIS7-Benutzeroberfläche leider nichts, was dies tun könnte.

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, Inhalte für 7 Tage in diesem Ordner und allen Unterordnern zwischenzuspeichern.

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

\ Windows \ system32 \ inetsrv \ appcmd.exe 
  set config "Standardwebsite / Ordner" 
  -section: system.webServer / staticContent 
  -clientCache.cacheControlMode: UseMaxAge

\ Windows \ system32 \ inetsrv \ appcmd.exe 
  set config "Standardwebsite / Ordner" 
  -section: system.webServer / staticContent 
  -clientCache.cacheControlMaxAge: "7.00: 00: 00"
Jeff Atwood
quelle
5
Die MSDN-Dokumentation für das Konfigurationselement staticContent finden Sie hier: msdn.microsoft.com/en-us/library/ms689443.aspx
Milan Gardian
4
Siehe 360Airwalk Beiträge unten, es gibt eine Benutzeroberfläche dafür in IIS7
ChadT
Nur zur Information: Diese Einstellung scheint keine Auswirkungen auf den integrierten Entwicklungsserver zu haben (zumindest von VS 2010 SP1). Wenn Sie Zweifel haben, warum es nicht funktioniert, wenden Sie sich an den IIS.
6
Hallo Jeff, wissen Sie, wie Sie verschiedene Cache-Control( max-age) Header für verschiedene MIME-Typen oder Dateierweiterungen bereitstellen können?
Jasper
@ Jeff Atwood Vielleicht kannst du mir helfen. Schauen Sie sich das an: stackoverflow.com/questions/57990579/…
Success Man
115

Das stimmt nicht Jeff.

Sie müssen lediglich einen Ordner in Ihrer IIS 7 Manager-Benutzeroberfläche auswählen (z. B. Bilder oder Ereignis im Standard-Webanwendungsordner) und dann auf "HTTP-Antwortheader" klicken. Dann müssen Sie im rechten Bereich auf "Gemeinsame Kopfzeile festlegen ..." klicken und "Webinhalt ablaufen" auswählen. Dort können Sie ganz einfach ein Höchstalter von 24 Stunden konfigurieren, indem Sie "Nach:" wählen, "24" in das Textfeld eingeben und "Stunden" in der Combobox auswählen.

Ihr erster Absatz zum Eintrag 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 nach Bedarf web.config-Einträge (oder -Dateien) bereitstellen.

Edit: einen verwirrenden Satz entfernt :)

360Airwalk
quelle
1
Die Benutzeroberfläche für diese Einstellung ist schrecklich. Aber danke, dass Sie erklärt haben, wie Sie dorthin gelangen! +1
Billy Coover
Diese Schnittstelle erstellt eine web.config mit derselben Konfiguration wie Jeff. Gut zu wissen! Vielen Dank!
Randy Morris
2
Danke für den Beitrag @ 360Airwalk. Wissen Sie, wie Sie verschiedene Cache-Control( max-age) Header für verschiedene MIME-Typen oder Dateierweiterungen bereitstellen können?
Jasper
3
@Jasper: Sie können es zum Beispiel pro Ordner festlegen. Wenn Sie das Cache-Steuerelement für einen Ordner festlegen, erben Unterordner die Einstellung, können sie jedoch erneut überschreiben und so weiter. Sie können dies sogar pro Datei tun. Wenn Sie nicht auf die iis-Konsole zugreifen können, können Sie dies auch über web.config tun. siehe diesen Beitrag für den letzteren stackoverflow.com/questions/2195266/…
360Airwalk
27

ich benutze das

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

statischen Inhalt für 500 Tage mit einem öffentlichen Cache-Control-Header zwischenzuspeichern.

Elmer
quelle
10
Empfohlene Praxis ist 1 Jahr im Wesentlichen 365 Tage nicht mehr.
Anicho
5
500 Tage ist SCHLECHT, dass Artikel über eine RFC-Regel sprechen, die besagt, dass der Cache nicht auf mehr als 1 Jahr festgelegt werden soll. Developers.google.com/speed/docs/best-practices/caching Setzen Sie ihn in Zukunft nicht auf mehr als ein Jahr , da dies gegen die RFC-Richtlinien verstößt.
Foxontherock
@foxontherock Wie könnten Sie die RFC-Regel von mehr als 365 Tagen als schlechte Praxis begründen? Ich kann nichts finden, um dies in der Dokumentation
vorzuschlagen
@ Elmer Vielleicht kannst du mir helfen. Schauen Sie sich das an: stackoverflow.com/questions/57990579/…
Success Man
19

Die F5-Aktualisierung hat die Semantik "Bitte laden Sie den aktuellen HTML- Code UND seine direkten Abhängigkeiten neu". Daher sollten Sie erwarten, 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 eine F5-Aktualisierung impliziert, dass der Browser die Anforderung 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 304 erzwingen, indem Sie die Strg-Taste gedrückt halten und in den meisten Browsern die Taste f5 drücken.

AnthonyWJones
quelle
18

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

Um statischen Inhalt 365 Tage lang mit einem öffentlichen Cache-Steuerungsheader zwischenzuspeichern , kann IIS wie folgt konfiguriert werden

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

Dies führt zu einem Header wie dem folgenden:

Cache-Control: public,max-age=31536000

Beachten Sie, dass das maximale Alter ein Delta in Sekunden ist, das durch eine positive 32-Bit-Ganzzahl ausgedrückt wird, wie in den RFC 2616-Abschnitten 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 die Kompatibilität zwischen Clients und Servern besser zu gewährleisten, empfehlen wir jedoch ein Maximum von 365 Tagen (ein Jahr).

Wie in anderen Antworten erwähnt, können Sie diese Anweisungen auch in der web.config Ihrer Website für alle statischen Inhalte verwenden. Alternativ können Sie es auch nur für Inhalte an einem bestimmten Speicherort 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>
Luciano Carvalho
quelle
Luciano, ich versuche meine Bilder mit Ihrer Methode zwischenzuspeichern. Wenn ich jetzt mit HttpFox analysiere, sehe ich 2 Anfragen für jedes Bild. 1. Die erste gibt ein abgebrochenes Ergebnis mit dem Fehler (NS_BINDING_ABORTED). 2. Die zweite Anforderung ist ein zwischengespeichertes Bild. Irgendwelche Gedanken?
Mithil
1

Es gibt einen einfachen Weg: 1. Verwenden Sie die web.config der Website. 2. Entfernen Sie im Abschnitt "staticContent" eine bestimmte Dateierweiterung 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>
user1401317
quelle