Я не уверен, что это проблема сервера, или я не понимаю, как работает кеширование 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-кеширование?