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, помимо установки стороннего программного обеспечения...