Керування кешем IIS7


95

Я намагаюся зробити щось, що, на мою думку, було досить простим. Отримайте IIS 7, щоб повідомити клієнтам, що вони можуть кешувати всі зображення на моєму сайті протягом певного часу, скажімо, 24 години.

Я спробував крок на http://www.galcho.com/Blog/post/2008/02/27/IIS7-How-to-set-cache-control-for-static-content.aspx, але безуспішно. Я все ще отримую запити, що надходять на сервер із поверненням 304 секунд.

Хтось має спосіб зробити це? У мене графічно інтенсивний сайт, і моїх користувачів забивають (як і мій сервер) кожного разу, коли вони запитують сторінку. Дивно, що на зображеннях у Firebug відображається "Керування кешем, max-age = 3600", але браузер все ще запитує їх, коли я натискаю F5.

Відповіді:


124

Якщо ви хочете встановити заголовок Cache-Control, в інтерфейсі IIS7 немає нічого для цього робити, на жаль.

Однак ви можете опустити цей web.config в кореневій папці або на веб-сайті, де ви хочете його встановити:

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

Це повідомить клієнта про кешування вмісту протягом 7 днів у цій папці та всіх підпапках.

Ви також можете зробити це, відредагувавши метабазу IIS7 за допомогою appcmd.exe:

\ Windows \ system32 \ inetsrv \ appcmd.exe 
  встановити конфігурацію "Веб-сайт / папка за замовчуванням" 
  -секція: system.webServer / staticContent 
  -clientCache.cacheControlMode: UseMaxAge

\ Windows \ system32 \ inetsrv \ appcmd.exe 
  встановити конфігурацію "Веб-сайт / папка за замовчуванням" 
  -секція: system.webServer / staticContent 
  -clientCache.cacheControlMaxAge: "7.00: 00: 00"

5
Документацію MSDN для елемента конфігурації staticContent можна знайти тут: msdn.microsoft.com/en-us/library/ms689443.aspx
Мілан Гардіан,

4
Див. Дописи 360Airwalk нижче, для цього є інтерфейс користувача в IIS7
ChadT

Просто як інформація: цей параметр, здається, не впливає на вбудований сервер розробки (принаймні для VS 2010 SP1). Якщо ви сумніваєтеся, чому це не працює, зверніться до IIS.

6
Привіт Джеффе, ти знаєш, як обслуговувати різні Cache-Control( max-age) заголовки для різних типів mime або розширень файлів?
Джаспер

@Jeff Atwood Можливо, ви можете мені допомогти. Подивіться на це: stackoverflow.com/questions/57990579/…
Success Man

115

Це не так Джефф.

Вам просто потрібно вибрати папку у своєму інтерфейсі менеджера IIS 7 (наприклад, Зображення або подія за замовчуванням папка веб-програми), а потім клацнути на "Заголовки відповідей HTTP". Потім потрібно натиснути на "Встановити загальний заголовок .." на правій панелі та вибрати "Термін дії веб-вмісту". Там ви можете легко налаштувати максимальний вік до 24 годин, вибравши "Після:", ввівши "24" у текстовому полі та вибравши "Години" у списку.

Ваш перший абзац щодо запису web.config правильний. Я додав би атрибут cacheControlCustom-атрибут, щоб встановити заголовок кеш-керування на "public" або що б там не було потрібно в цьому випадку.

Звичайно, ви можете досягти того ж, надавши записи web.config (або файли) за потреби.

Редагувати: видалено заплутане речення :)


1
Інтерфейс користувача для цього налаштування жахливий. Але дякую за пояснення, як туди дістатися! +1
Біллі Кувер,

Цей інтерфейс створює web.config з тією ж конфігурацією, що і Джефф. Добре знати! Дякую!
RandyMorris

2
Дякую за допис @ 360Airwalk. Чи знаєте ви про те, як обслуговувати різні Cache-Control( max-age) заголовки для різних типів mime або розширень файлів?
Джаспер

3
@Jasper: наприклад, ви можете встановити його для кожної папки. якщо ви встановите кеш-контроль для папки, вкладені папки успадкують цей параметр, але ви можете його замінити ще раз і так далі. Ви навіть можете зробити це для кожного файлу. якщо ви не можете отримати доступ до консолі iis, ви можете зробити це також через web.config. побачити цей пост для останнього stackoverflow.com/questions/2195266 / ...
360Airwalk

27

Я цим користуюся

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

кешувати статичний вміст протягом 500 днів за допомогою загальнодоступного заголовка кешування.


10
Рекомендована практика - 1 рік, по суті не більше 365 днів.
Анічо

5
500 днів - це БАД, ці статті говорять про правило RFC, в якому говориться не встановлювати кеш більше 1 року developers.google.com/speed/docs/best-practices/caching Не встановлюйте для нього більше одного року в майбутньому , оскільки це порушує вимоги RFC.
foxontherock

@foxontherock будь-яким чином ви могли б обґрунтувати правило RFC про те, що понад 365 днів є поганою практикою? Я не можу знайти нічого, що наводить це на думку в документації ...
Paesano2000

@Elmer Можливо, ти можеш мені допомогти. Подивіться на це: stackoverflow.com/questions/57990579/…
Success Man

19

F5 Refresh має семантику "будь-ласка, перезавантажте поточний HTML І його прямі залежності". Отже, слід очікувати, що будь-які ресурси imgs, css та js, на які безпосередньо посилається HTML, також переглядаються. Звичайно, 304 є прийнятною відповіддю на це, але оновлення F5 означає, що браузер буде робити запит, а не покладатися на свіжий вміст кешу.

Натомість спробуйте просто орієнтуватися в іншому місці, а потім повернутися назад.

Ви можете примусити оновлення після 304, утримуючи ctrl, натискаючи f5 у більшості браузерів.


18

Доповнюючи відповідь Елмера, коли мою редакцію відкотили назад.

Щоб кешувати статичний вміст протягом 365 днів за допомогою загальнодоступного заголовка кешування , IIS можна налаштувати за допомогою наступного

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

Це перетвориться на такий заголовок:

Cache-Control: public,max-age=31536000

Зверніть увагу, що максимальний вік - це дельта в секундах, виражена позитивним цілим 32- бітним числом, як зазначено в RFC 2616, розділи 14.9.3 та 14.9.4 . Це являє собою максимальне значення 2 ^ 31 або 2147483488 секунд (протягом 68 років). Однак, щоб краще забезпечити сумісність між клієнтами та серверами, ми приймаємо рекомендований максимум 365 днів (один рік).

Як зазначалося в інших відповідях, ви можете використовувати ці директиви також на web.config вашого сайту для всього статичного вмісту. Як альтернативу, ви можете використовувати його лише для вмісту в певному місці (у зразку, 30-денний загальнодоступний кеш для вмісту в папці "cdn"):

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

Лучано, я намагаюся кешувати свої зображення за допомогою твого методу. Тепер, коли я аналізую за допомогою HttpFox, я бачу 2 запити, зроблені для кожного зображення. 1. Перший дає перерваний результат із помилкою (NS_BINDING_ABORTED) 2. Другий запит - кешоване зображення. Будь-які думки?
Mithil

1

існує простий спосіб: 1. за допомогою веб-сайту web.config 2. у розділі "staticContent" видалити конкретне розширення файлу та додати mimeMap 3. додати "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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.