Путаница с кешированием HTTP - PullRequest
11 голосов
/ 07 июня 2010

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

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

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

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

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

Не понимаю ли я, как вообще работает HTTP-кэширование?

Ответы [ 3 ]

6 голосов
/ 07 июня 2010

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

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

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

Войти на сервер
Откройте Диспетчер IIS (Пуск -> Администрирование -> Диспетчер iis
Разверните узел сервера
Разверните узел сайтов
Откройте сайт и перейдите в каталог, который вы хотите изменить
Откройте раздел Заголовки ответа HTTP IIS
Нажмите Установить общие заголовки на панели задач справа
Установите «Expire Web Content», как требует ваше приложение.

5 голосов
/ 07 июня 2010

использовать заголовок 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>
0 голосов
/ 07 июня 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...