Chrome - почему он отправляет запросы if-Modified-Since?

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

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

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

Спасибо

7 ответов

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<FilesMatch ".(jpg|jpeg|png|gif)$">
Header set Cache-Control "max-age=604800, public" # 7 days
</FilesMatch>

или что-то вроде

ExpiresByType image/jpeg "access plus 7 days"
ExpiresByType image/gif "access plus 7 days"
ExpiresByType image/png "access plus 7 days"

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

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

Другие вопросы по тегам