Беспорядок кэширования HTTP

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

У меня есть приложение MVC ASP, работающее на 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, Не Измененными - сообщение браузера, что это может использовать ранее загруженный файл.

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

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

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

Как я установил бы это в .NET web.config для IIS7?

Я неправильно понимаю, как кэширование HTTP работает во-первых?

11
задан Keith 7 June 2010 в 14:42
поделиться

3 ответа

используйте заголовок expires вместо использования cache-control. Сообщите своему серверу в первый раз, что до этой даты истечения срока мне предоставляется контент из кеша моего браузера. До истечения срока действия перекрестной проверки изменений в файле не будет.

добавьте заголовок в раздел system.webServer вашего web.config следующим образом:

<system.webServer>
    <staticContent>
        <clientCache httpExpires="Sun, 29 Mar 2020 00:00:00 GMT" 
                     cacheControlMode="UseExpires" />;
    </staticContent>
</system.webServer>
5
ответ дан 3 December 2019 в 10:03
поделиться

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

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

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

Войдите на сервер
Откройте диспетчер IIS (пуск -> инструменты администрирования -> диспетчер iis
Разверните узел сервера
Разверните узел сайтов
. Откройте сайт и перейдите в каталог, который хотите изменить
Откройте раздел заголовков ответов HTTP IIS
Щелкните Установить общие заголовки на панели задач справа
Установите «Срок действия веб-содержимого», как того требует ваше приложение.

6
ответ дан 3 December 2019 в 10:03
поделиться

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

Вам следует ознакомиться с 35 рекомендациями по повышению производительности Yahoo , а более конкретно:

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

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

-1
ответ дан 3 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: