IIS7 Cache-Control

95

Próbuję zrobić coś, co według mnie byłoby dość proste. Pobierz IIS 7, aby powiedzieć klientom, że mogą buforować wszystkie obrazy w mojej witrynie przez określony czas, powiedzmy 24 godziny.

Próbowałem tego kroku na http://www.galcho.com/Blog/post/2008/02/27/IIS7-How-to-set-cache-control-for-static-content.aspx, ale bezskutecznie. Nadal otrzymuję żądania przychodzące do serwera z zwracanymi 304s.

Czy ktoś ma na to sposób? Mam witrynę z intensywną grafiką, a moi użytkownicy (podobnie jak mój serwer) są atakowani za każdym razem, gdy żądają strony. Dziwne, że obrazy wydają się mieć „Cache-Control private, max-age = 3600” pojawiające się w Firebug, ale przeglądarka nadal żąda ich, kiedy naciskam F5.

Chris Meek
źródło

Odpowiedzi:

124

Jeśli chcesz ustawić nagłówek Cache-Control, niestety w interfejsie użytkownika IIS7 nie ma nic, co mogłoby to zrobić.

Możesz jednak upuścić ten plik web.config w katalogu głównym folderu lub witryny, w którym chcesz go ustawić:

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

Poinformuje to klienta o konieczności buforowania zawartości przez 7 dni w tym folderze i wszystkich podfolderach.

Możesz to również zrobić, edytując metabazę IIS7 za pomocą appcmd.exe, na przykład:

\ Windows \ system32 \ inetsrv \ appcmd.exe 
  ustaw konfigurację "Domyślna witryna internetowa / folder" 
  -section: system.webServer / staticContent 
  -clientCache.cacheControlMode: UseMaxAge

\ Windows \ system32 \ inetsrv \ appcmd.exe 
  ustaw konfigurację "Domyślna witryna internetowa / folder" 
  -section: system.webServer / staticContent 
  -clientCache.cacheControlMaxAge: „7.00: 00: 00”
Jeff Atwood
źródło
5
Dokumentację MSDN dotyczącą elementu konfiguracji staticContent można znaleźć tutaj: msdn.microsoft.com/en-us/library/ms689443.aspx
Milan Gardian,
4
Zobacz posty 360Airwalk poniżej, interfejs użytkownika do tego jest dostępny w IIS7
ChadT,
Dla informacji: wydaje się, że to ustawienie nie ma wpływu na wbudowany serwer deweloperski (przynajmniej VS 2010 SP1). Jeśli masz wątpliwości, dlaczego to nie działa, sprawdź w usługach IIS.
6
Cześć Jeff, czy wiesz, jak obsługiwać różne Cache-Control( max-age) nagłówki dla różnych typów MIME lub rozszerzeń plików?
Jasper
@Jeff Atwood Może możesz mi pomóc. Spójrz na to: stackoverflow.com/questions/57990579/…
Success Man
116

To nieprawda, Jeff.

Wystarczy wybrać folder w interfejsie użytkownika Menedżera usług IIS 7 (np. Obrazy lub zdarzenie folder domyślnej aplikacji sieci Web), a następnie kliknąć „Nagłówki odpowiedzi HTTP”. Następnie należy kliknąć „Ustaw wspólny nagłówek…” w prawym okienku i wybrać „Wygaś zawartość sieci Web”. Tam możesz łatwo skonfigurować maksymalny wiek 24 godzin, wybierając „Po:”, wpisując „24” w polu tekstowym i wybierając „Godziny” w polu wyboru.

Twój pierwszy akapit dotyczący wpisu web.config ma rację. Dodałbym atrybut cacheControlCustom-attribute, aby ustawić nagłówek kontroli pamięci podręcznej na „public” lub cokolwiek jest potrzebne w tym przypadku.

Możesz oczywiście osiągnąć to samo, dostarczając w razie potrzeby wpisy (lub pliki) web.config.

Edycja: usunięto mylące zdanie :)

360Airwalk
źródło
1
Interfejs użytkownika dla tego ustawienia jest okropny. Ale dzięki za wyjaśnienie, jak się tam dostać! +1
Billy Coover
Ten interfejs tworzy plik web.config z taką samą konfiguracją, jaką opublikował Jeff. Dobrze wiedzieć! Dzięki!
RandyMorris,
2
Dzięki za post @ 360Airwalk. Czy wiesz, jak obsługiwać różne nagłówki Cache-Control( max-age) dla różnych typów MIME lub rozszerzeń plików?
Jasper
3
@Jasper: możesz ustawić go na przykład dla folderu. jeśli ustawisz kontrolę pamięci podręcznej w folderze, podfoldery odziedziczą to ustawienie, ale możesz je ponownie zastąpić i tak dalej. możesz to zrobić nawet dla każdego pliku. jeśli nie możesz uzyskać dostępu do konsoli iis, możesz to również zrobić przez web.config. zobacz ten post dotyczący tego ostatniego stackoverflow.com/questions/2195266/…
360Airwalk
27

używam tego

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

buforować statyczną zawartość przez 500 dni za pomocą publicznego nagłówka Cache-Control.

Elmer
źródło
10
Zalecana praktyka to 1 rok, w zasadzie 365 dni nie więcej.
Anicho
5
500 dni to ZŁE artykuły, które mówią o regule RFC mówiącej, aby nie ustawiać pamięci podręcznej na więcej niż 1 rok developers.google.com/speed/docs/best-practices/caching Nie ustawiaj tego na więcej niż rok w przyszłości , ponieważ narusza to wytyczne RFC.
foxontherock
@foxontherock w jakikolwiek sposób mógłbyś uzasadnić, że reguła RFC dłuższa niż 365 dni jest złą praktyką? Nie mogę znaleźć niczego, co by to sugerowało w dokumentacji ...
Paesano2000
@Elmer Może możesz mi pomóc. Spójrz na to: stackoverflow.com/questions/57990579/…
Success Man
19

F5 Refresh ma semantykę "proszę przeładować bieżący HTML ORAZ jego bezpośrednie zależności". Dlatego powinieneś spodziewać się, że wszystkie zasoby imgs, css i js, do których bezpośrednio odwołuje się kod HTML, również zostaną poprawione. Oczywiście 304 jest akceptowalną odpowiedzią na to, ale odświeżanie F5 oznacza, że ​​przeglądarka wykona żądanie zamiast polegać na świeżej zawartości pamięci podręcznej.

Zamiast tego spróbuj po prostu przejść do innego miejsca, a następnie wrócić.

Możesz wymusić odświeżenie, poza 304, przytrzymując ctrl i naciskając klawisz F5 w większości przeglądarek.

AnthonyWJones
źródło
18

Uzupełniając odpowiedź Elmera, ponieważ moja edycja została wycofana.

Aby buforować zawartość statyczną przez 365 dni z publicznym nagłówkiem kontroli pamięci podręcznej , usługi IIS można skonfigurować w następujący sposób

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

To przełoży się na taki nagłówek:

Cache-Control: public,max-age=31536000

Należy pamiętać, że maksymalny wiek to delta w sekundach wyrażona przez dodatnią 32- bitową liczbę całkowitą, jak podano w RFC 2616, sekcje 14.9.3 i 14.9.4 . Odpowiada to maksymalnej wartości 2 ^ 31 lub 2 147 483 648 sekund (ponad 68 lat). Jednak, aby lepiej zapewnić kompatybilność między klientami a serwerami, przyjmujemy zalecane maksymalnie 365 dni (jeden rok).

Jak wspomniano w innych odpowiedziach, możesz użyć tych dyrektyw również w pliku web.config swojej witryny dla całej zawartości statycznej. Alternatywnie możesz go używać tylko dla treści w określonej lokalizacji (na przykładzie, 30-dniowa publiczna pamięć podręczna dla zawartości w folderze „cdn”):

<location path="cdn">
   <system.webServer>
        <staticContent>
             <clientCache cacheControlCustom="public" cacheControlMode="UseMaxAge" cacheControlMaxAge="30.00:00:00"/>
        </staticContent>
   </system.webServer>
</location>
Luciano Carvalho
źródło
Luciano, próbuję buforować moje obrazy przy użyciu twojej metody. Teraz, kiedy analizuję za pomocą HttpFox, widzę 2 żądania dla każdego obrazu. 1. Pierwsze z nich daje przerwany wynik z błędem (NS_BINDING_ABORTED). 2. Drugie żądanie to buforowany obraz. jakieś pomysły?
Mithil
1

jest na to prosty sposób: 1. używając web.config strony 2. w sekcji "staticContent" usuń określony plik fileExtension i dodaj mimeMap 3. dodaj "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
źródło