Chrome - почему он отправляет запросы if-Modified-Since? - PullRequest
19 голосов
/ 14 октября 2010

У меня есть страница с множеством маленьких картинок (иконок). При использовании с chrome при каждой перезагрузке страницы chrome запрашивает каждый значок с сервера с заголовком if-updated-Since.

Все значки поставляются с истечением срока действия и максимальным возрастом заголовков. Firefox загружает изображения из своего кэша.

Почему Chrome делает это и как я могу предотвратить это?

Спасибо

Ответы [ 7 ]

14 голосов
/ 01 февраля 2011

Вы проверили заголовки запроса?

"Cache-Control" всегда установлен на "max-age = 0", независимо от того, нажимаете ли вы ввод, f5 или ctrl + f5. За исключением случаев, когда вызапустите Chrome, введите URL и нажмите enter. "

http://techblog.tilllate.com/2008/11/14/clientside-cache-control/

13 голосов
/ 03 мая 2012

Для chrome важно, обновляете ли вы страницу или просто посещаете ее.

При обновлении chrome будет проверять сервер для каждого файла независимо от того, кэшированы они или нет.Если файл не был изменен, вы должны увидеть ответ 304 Не изменено .Если файл был изменен, вместо этого вы увидите ответ 200 OK .

Если не обновлять, кэшированные файлы будут иметь статус 200 OK , но если вы посмотритев столбце размера / содержимого сетевой панели вы увидите (из кэша) .

12 голосов
/ 30 января 2011

Google Chrome будет игнорировать заголовок Expires, если это недопустимая дата в RFC. Например, это всегда требует, чтобы дни были указаны как двузначные числа. 1 мая должно быть установлено как «01 мая» (не «1 мая») и так далее. Firefox принимает их, это вводит пользователя в заблуждение, что проблема в браузере (в данном случае Chrome), а не в самих значениях заголовка.

Итак, если вы устанавливаете дату истечения вручную (без использования mod_expires или чего-то подобного для вычисления фактической даты), я рекомендую вам проверить ваши статические заголовки файлов с помощью REDbot .

9 голосов
/ 14 октября 2010

Быстрый эксперимент с инспектором Chrome показывает, что это происходит только при перезагрузке страницы, а не при нормальной загрузке.Chrome просто пытается обновить кеш.Подумайте об этом - если вы установите Expires и Max-Age на несколько десятилетий, вы просите браузер кэшировать этот ресурс и никогда проверять, обновляется ли он?Когда это возможно, он кэширует ресурс, но когда необходимо обновить страницу, он хочет убедиться, что вся страница обновлена.Конечно, другие браузеры тоже это делают (хотя в некоторых есть опция, позволяющая определить количество часов ожидания перед обновлением).

Благодаря современным браузерам и серверам обновление большого количества значков не будет таким медленным, как вы.Мысли - запросы передаются по конвейеру, чтобы устранить множественные задержки в оба конца, и вся цель заголовка If-Modified-Since состоит в том, чтобы позволить серверу сравнивать метки времени и возвращать код состояния «Не изменен».Это будет происходить для каждого ресурса, который необходим странице, но браузер сможет сразу выполнить все запросы и убедиться, что ни один из них не изменился.

При этом есть несколько вещей, которые вы можете сделать, чтобысделать это проще:

  1. В инспекторе Chrome откройте вкладку ресурсов, чтобы узнать, как они загружаются.Если заголовки запроса отсутствуют, ресурс загружался непосредственно из кеша.Если вы видите 304 Not Modified, ресурс был обновлен, но его не нужно было загружать снова.Если вы видите 200 OK, он был загружен снова.

  2. В инспекторе Chrome перейдите на вкладку аудита, чтобы узнать, что он думает о кешируемости ваших ресурсов, на случай, если некоторые иззаголовки кэша не оптимальны.

  3. Все эти If-Modified-Since запросы и 304 ответа могут суммироваться, даже если они состоят только из заголовков.Объедините ваши изображения в спрайты, чтобы уменьшить количество запросов.

4 голосов
/ 14 октября 2010

Современные браузеры становятся все более сложными и интеллектуальными с их поведением кэширования. Прочитайте http://blogs.msdn.com/b/ie/archive/2010/07/14/caching-improvements-in-internet-explorer-9.aspx для некоторых примеров и более подробной информации.

Как говорит Флориан, не борись с этим: -)

0 голосов
/ 14 октября 2010

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

ExpiresByType image/jpeg "access plus 7 days"<br> ExpiresByType image/gif "access plus 7 days"<br> ExpiresByType image/png "access plus 7 days"

Обычно я группирую типы файлов по использованию в одном каталоге и соответственно устанавливаю время жизни.

Браузеры не должны запрашивать файлы вообще, пока не истечет этот возраст,но может не всегда чтить это.Возможно, вам захочется / нужно поработать с заголовками Last-Modified и ETag.Об этом есть много полезной информации.

0 голосов
/ 14 октября 2010

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

...