2010-06-07 3 views
11

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

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

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

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

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

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

+0

Вы можете отключить ETag? Это может вас исправить, но я не уверен. –

+0

Я попытаюсь удалить ETag, но для моего тестового сервера это похоже на совпадение – Keith

+6

Если вы нажмете обновление или F5, браузер всегда будет запрашивать сервер (возможно, условный запрос) независимо от настроек кэша –

ответ

5

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

добавить заголовок в разделе system.webServer вашего Web.config как так:

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

Как бы это сделать в IIS7? Также - почему это работает, когда 'cache-control' не работает? – Keith

+0

Спасибо за разъяснение - так что 'cache-control' сломан? – Keith

+0

Нет, я верю, что что-то и вы, и я пропали без вести. Я читаю больше о кеш-контроле на этом этапе, и вы узнаете, если я выясню. Да, но мое предложение сработало для вас. –

6

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

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

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

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

+1

Спасибо - ваши шаги в IIS7 на самом деле производят тот же XML-файл web.config, что и в моем вопросе. – Keith

-1

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

Вы должны проверить 35 Yahoo Performance best practices, а более конкретно:

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

Edit: хорошо, похоже, нет простого способа удалить ETags в IIS, besides installing some 3rd party software ...

+0

К сожалению, не представляется возможным удалить ETags на IIS7 - см. Http://stackoverflow.com/questions/477913 – Keith

+0

Почему заголовок 'expire' работает, когда' cache-control' не работает? Нам не нужно поддерживать IE5 и все, что поддерживает HTTP 1.1. – Keith

+0

Спасибо за ответ (+1).'Expires' и' Cache-Control' работают одинаково хорошо (если вы не находитесь на IE5 или ниже, то только «Expires'), если у вас установлено, что вы хороши. Оказывается, моя фактическая проблема заключалась в том, что я нажимал F5/refresh для проверки, и это всегда заставляет браузер выполнять ping для каждого файла и получать ответы _304 Not Modified_. – Keith

Смежные вопросы