2014-05-19 2 views
1

Если ответ с заголовком Cache-Control с максимальным возрастом в какой-то момент в будущем отправит условный запрос в следующий раз, когда потребуется ресурс?Заголовок кэширования и условные запросы

Например, я установил сервер для возврата заголовка Cache-Control на срок до истечения 10 дней, и, конечно же, первый ответ для ресурса с сервера - Http Status: 200 с заголовком Cache-Control max-age=864000. Однако во второй раз, когда требуется ресурс, выполняется другой запрос, и на этот раз возвращается Http Status: 304. Оба раза заголовок Last-Modified - это некоторая дата в прошлом.

Тот факт, что я получаю статус 304, не вызывает удивления после того, как весь ресурс не изменился, и затем используется версия кеша. Однако, если запрос, который явно является условным, должен быть сделан в первую очередь? У меня создалось впечатление, что если максимальный возраст заголовка управления кешем не был превышен, браузер не должен даже делать запрос, а вместо этого должен просто использовать кеш-версию ресурса.

Сначала я подумал, что это проблема браузера IE9, так как это был браузер, в котором я тестировал его, и после небольшого поиска в Google я нашел следующую статью на caching improvements in IE9. Статья подтверждает то, что я имел в виду, что никакой запрос не должен быть сделан для кэшированных ресурсов, которые не являются устаревшими:

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

Если кэшировать отклик является устаревшим (старше его максимального возраста или мимо Истекает дату), то клиент сделает условный запрос к серверу , чтобы определить, является ли в кэше ответа остается в силе и должны быть повторно использован. Условный запрос содержит заголовок If-Modified-Since и/или If-None-Match, который указывает серверу , какую версию содержимого уже содержит кеш браузера. Сервер может указывать на то, что версия клиента все еще обновляется , возвращая HTTP/304 Not Modified заголовки без тела, или может указать, что версия клиента устарела, возвращая ответ OK/HTTP OK с новой версией Контент.

Я также проверил Свойства обозревателя для IE и проверил вариант Check for newer versions of stored pages был установлен в Automatically, который должен позволить браузеру решить, когда сделать запрос ресурса.

Для хорошей меры я также протестировал это в Firefox и Chrome и обнаружил, что это не проблема IE9, поскольку оба этих браузера ответили так же, как IE9, и отправили условные ответы.

Это обычное поведение при отправке условного запроса для кэшированного элемента, который не является устаревшим?

ответ

2

Вы правы. При нормальных обстоятельствах не требуется выдавать условные запросы, если кеш остается действительным. Это означает, что происходит что-то еще, что заставляет браузер пойти и проверить кеш.Читайте по теме:

Есть целый ряд причин, почему IE может сделать условный запрос для элемента, который уже находится в кэше:

  • Кэшированное элемент больше не является свежим согласно cache- Контроль или Истекает
  • Кэшированное пункт был доставлен с Варах заголовком
  • содержащий страница была навигация с помощью метаобновление
  • JavaScript на странице под названием перезарядка на месте объект, передавая значение TRUE для bReloadSource
  • Запрос был для кросс-хоста HTTPS ресурса при запуске браузера
  • Пользователь обновляли страницу

Таким образом, вы должны будете сделать немного покопаться, чтобы найти что происходит. Вы можете получить дополнительную информацию по следующей ссылке: http://blogs.msdn.com/b/ieinternals/archive/2010/07/08/technical-information-about-conditional-http-requests-and-the-refresh-button.aspx

+0

Спасибо за вашу помощь, однако я просмотрел список, и ни один из них не применяется. Кэш-контроль согласно описанию вопроса действителен. Нет заголовка Expires или заголовка Vary. Содержащая страница не содержит META REFRESH. Страница обновляется нажатием клавиши F5, поэтому сценарий не задействован. Страница https, однако это все для одного домена. –

+0

Я только что прочитал ссылку, которую вы опубликовали, и понял, что последняя марка должна быть в вашем резюме на самом деле должна быть две. Вместо одного. Из деталей в ссылке выглядит, что браузер всегда будет выполнять условный http-запрос, если страница обновляется вручную с использованием обычного обновления (F5 без удержания Ctrl). И полное безусловное обращение с использованием принудительного обновления (Ctrl + F5). Поэтому ответ на мой вопрос - да, если браузер обновляется (как и в моих тестах), и нет, если запрашивается только страница. –

+0

IE11 (по крайней мере) с открытым отладчиком, похоже, влияет на поведение здесь, вызывая условное GET для ресурса, даже если его новая копия присутствует в кеше браузера. Закрытие отладчика возвращается к ожидаемому поведению, то есть к загрузке из кеша. –

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