HTTP-кэширование путаницы

Я не уверен, что это проблема сервера, или я не понимаю, как работает кеширование HTTP.

У меня есть приложение ASP MVC, работающее на IIS7. Там много статического контента как часть сайта, включая множество файлов CSS, Javascript и изображений.

Для этих файлов я хочу, чтобы браузер кэшировал их хотя бы на день - наши файлы .css,.js,.gif и .png редко меняются.

Мой web.config выглядит следующим образом:

<system.webServer>
    <staticContent>
        <clientCache cacheControlMode="UseMaxAge" 
                     cacheControlMaxAge="1.00:00:00" />
    </staticContent>
</system.webServer>

Проблема, которую я получаю, заключается в том, что браузер (проверенный Chrome, IE8 и FX), похоже, не кэширует файлы, как я ожидал. У меня есть настройки по умолчанию (сначала проверьте новые страницы в IE).

При первом посещении загрузки контента, как ожидалось

HTTP/1.1 200 OK
Cache-Control: max-age=86400
Content-Type: image/gif
Last-Modified: Fri, 07 Aug 2009 09:55:15 GMT
Accept-Ranges: bytes
ETag: "3efeb2294517ca1:0"
Server: Microsoft-IIS/7.0
X-Powered-By: ASP.NET
Date: Mon, 07 Jun 2010 14:29:16 GMT
Content-Length: 918

<content>

Я думаю, что Cache-Control: max-age=86400 должен сказать браузеру не запрашивать страницу еще раз за день.

Итак, теперь страница перезагружается, и браузер снова запрашивает изображение. На этот раз он получает пустой ответ с этими заголовками:

HTTP/1.1 304 Not Modified
Cache-Control: max-age=86400
Last-Modified: Fri, 07 Aug 2009 09:55:15 GMT
Accept-Ranges: bytes
ETag: "3efeb2294517ca1:0"
Server: Microsoft-IIS/7.0
X-Powered-By: ASP.NET
Date: Mon, 07 Jun 2010 14:30:32 GMT

Итак, похоже, что браузер отправил обратно ETag назад (как уникальный идентификатор ресурса), а сервер вернулся с 304 Not Modified - сообщив обозревателю, что он может использовать ранее загруженный файл.

Мне кажется, что это будет правильно для многих ситуаций кеширования, но здесь я не хочу дополнительного тура. Мне все равно, если изображение устареет, когда файл на сервере изменится.

Есть много таких файлов (даже с картами спрайтов и т.п.), и многие из наших клиентов имеют очень медленные сети. Каждая поездка в оба конца для ping для этого статуса 304 занимает от 10 до 5 секунды. У многих также есть IE6, у которого есть только 2 HTTP-соединения за раз. Конечным результатом является то, что наше приложение выглядит очень медленным для этих клиентов, и каждая страница занимает дополнительные пару секунд, чтобы проверить, что статический контент не изменился.

Какой ответный заголовок мне не хватает, что заставит браузер агрессивно кэшировать файлы?

Как я могу установить это в .Net web.config для IIS7?

Я не понимаю, как работает HTTP-кеширование?

Ответ 1

Вам нужно использовать директиву Expires, иначе браузер всегда будет проверять, обновляется ли контент.

Если кэшированная запись имеет действительную дату истечения срока действия, браузер может повторно использовать контент, не связываясь с сервером вообще при повторном просмотре страницы или сайта. Это значительно сокращает количество сетевых поездок для часто посещаемых страниц. Например, логотип Google истекает в 2038 году и будет загружен только при первом посещении google.com или если вы очистили кеш браузера. Если они когда-либо захотят изменить изображение, они могут использовать другое имя или путь к файлу изображения.

Для изменения в IIS7 используйте следующее. Это проще всего управлять, если вы сохраняете статический контент в определенных каталогах.

Вход на сервер
Откройте диспетчер IIS (запуск → административные инструменты → iis manager
Разверните сервер node
Развернуть сайты node
Откройте сайт и перейдите в каталог, который хотите изменить. Откройте раздел заголовков HTTP-ответов IIS
Нажмите "Установить общие заголовки" на панели задач справа
Установите "Expire Web Content", как того требует ваше приложение.

Ответ 2

use expires заголовок вместо использования кеша-control.Tell ваш сервер в первый раз, которые служат мне содержимое из моего кеша браузера до этой даты истечения срока действия. Не будет перекрестной проверки изменений файла до истечения срока действия.

добавьте заголовок в свой раздел web.configs system.webServer, например:

<system.webServer>
    <staticContent>
        <clientCache httpExpires="Sun, 29 Mar 2020 00:00:00 GMT" 
                     cacheControlMode="UseExpires" />;
    </staticContent>
</system.webServer>

Ответ 3

Short anwser: удалите Etag и используйте заголовок Expire.

Вы должны проверить 35 лучших практик использования Yahoo, а точнее:

Для каждого правила они обычно охватывают конфигурации веб-сервера Apache и IIS.

Редактирование: хорошо, похоже, что нет простого способа удалить Etags в IIS, помимо установки стороннего программного обеспечения...