Управление кешем 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.

У кого-нибудь есть способ это сделать? У меня есть сайт с интенсивной графикой, и мои пользователи (как и мой сервер) подвергаются атакам каждый раз, когда они запрашивают страницу. Как ни странно, изображения, кажется, имеют «Cache-Control private, max-age = 3600», отображаемое в Firebug, но браузер все еще запрашивает их, когда я нажимаю 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 
  установить конфигурацию "Веб-сайт / папка по умолчанию" 
  -section: system.webServer / staticContent 
  -clientCache.cacheControlMode: UseMaxAge

\ Windows \ system32 \ inetsrv \ appcmd.exe 
  установить конфигурацию "Веб-сайт / папка по умолчанию" 
  -section: 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 или расширений файлов?
Джаспер
@ Джефф Этвуд Может, ты мне поможешь. Посмотрите на это: stackoverflow.com/questions/57990579/…
Success Man
116

Это неправда, Джефф.

Вам просто нужно выбрать папку в пользовательском интерфейсе диспетчера IIS 7 (например, изображения или событие - папка веб-приложения по умолчанию), а затем нажать «Заголовки ответа HTTP». Затем вам нужно щелкнуть «Установить общий заголовок ..» на правой панели и выбрать «Истекать срок действия веб-содержимого». Здесь вы можете легко настроить максимальный возраст в 24 часа, выбрав «После:», введя «24» в текстовое поле и выбрав «Часы» в поле со списком.

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

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

Изменить: удалили запутанное предложение :)

360Airwalk
источник
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 дней.
Anicho
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

Обратите внимание, что max-age - это дельта в секундах, выражаемая положительным 32-битным целым числом, как указано в разделах 14.9.3 и 14.9.4 RFC 2616 . Это представляет собой максимальное значение 2 ^ 31 или 2 147 483 648 секунд (более 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. Второй запрос - это кешированное изображение. Есть предположения?
Митхил
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>
user1401317
источник