Chrome игнорирует Cache-Control: максимальный возраст?
Фон:
- IIS 7
- Веб-приложение AspNet 3.5
Chrome dev tools перечисляет 98 запросов на домашнюю страницу веб-приложения (aspx + js + css + images). В следующих запросах код состояния 200
для файлов CSS / изображений. Нет информации о кеше, браузер каждый раз спрашивает сервер, нужно ли обновлять файл. ХОРОШО.
В IIS 7 я установил HTTP-заголовок для управления кэшем, установив 6 часов для папки "Ресурсы". В Chrome, используя инструменты разработчика, я вижу, что заголовок хорошо настроен в ответ:
Cache-Control: max-age=21600
Но я все еще получаю 98 запросов... Я думал, что браузер не должен запрашивать один ресурс, если срок его действия не достигнут, и я ожидал, что количество запросов будет отброшено...
5 ответов
Я понял. Google Chrome игнорирует Cache-Control
или же Expires
заголовок, если вы делаете запрос сразу же после другого запроса к тому же URI на той же вкладке (нажав кнопку обновления, нажав клавишу F5 или нажав Ctrl + R). Вероятно, у него есть алгоритм, позволяющий угадать, что пользователь действительно хочет сделать.
Способ проверить Cache-Control
Заголовок должен вернуть HTML-документ со ссылкой на себя. При нажатии на ссылку Chrome подает документ из кеша. Например, назовите следующий документ self.html:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Test Page</title>
</head>
<body>
<p>
<a href="self.html">Link to the same page.</a>
If correctly cached, a request should not be made
when clicking the link.
</p>
</body>
</html>
Другой вариант - скопировать URL-адрес и вставить его в ту же вкладку или другую вкладку.
ОБНОВЛЕНИЕ: В сообщении Chrome, опубликованном 26 января 2017 года, описывается, каково было предыдущее поведение и как оно изменяется, выполняя только повторную проверку основного ресурса, но не подресурсов:
Пользователи обычно перезагружаются либо потому, что страница не работает, либо содержимое кажется устаревшим. Существующее поведение при перезагрузке обычно решает проблемы с неработающими страницами, но устаревший контент неэффективно обрабатывается регулярной перезагрузкой, особенно на мобильных устройствах. Эта функция изначально была разработана во времена, когда сломанные страницы были довольно распространенным явлением, поэтому было разумно рассмотреть оба варианта использования одновременно. Однако эта первоначальная проблема стала гораздо менее актуальной, поскольку качество веб-страниц возросло. Чтобы улучшить случай использования устаревшего контента, в Chrome теперь упрощено поведение при перезагрузке, чтобы только проверять основной ресурс и продолжать обычную загрузку страницы. Это новое поведение максимизирует повторное использование кэшированных ресурсов и приводит к снижению задержки, энергопотребления и использования данных.
В сообщении Facebook, также опубликованном 26 января 2017 года, упоминается, что они обнаружили фрагмент кода, в котором Chrome делает недействительными все кэшированные ресурсы после запроса POST:
мы обнаружили, что Chrome будет повторно проверять все ресурсы на страницах, которые были загружены при выполнении запроса POST. Команда Chrome сообщила нам, что обоснование этого заключается в том, что запросы POST, как правило, представляют собой страницы, которые вносят изменения - например, совершают покупку или отправляют электронное письмо - и что пользователь хотел бы иметь самую последнюю страницу.
Кажется, это больше не так.
Наконец, описано, что Firefox представляет Cache-Control: immutable
полностью прекратить повторную проверку ресурсов:
Firefox реализовал предложение от одного из наших инженеров добавить новый заголовок контроля кэша для некоторых ресурсов, чтобы сообщить браузеру, что этот ресурс никогда не должен быть повторно проверен. Идея этого заголовка заключается в том, что разработчик обещает браузеру дополнительное обещание, что этот ресурс никогда не изменится в течение максимального срока службы. Firefox решил реализовать эту директиву в виде элемента управления кешем: неизменяемый заголовок.
Я надеюсь, что это помогает распутать тайны перезагрузки.
Chrome, кажется, игнорирует ваш Cache-Control
Настройки, если вы перезагружаете в той же вкладке. Если вы скопируете URL-адрес в новую вкладку и загрузите его там, Chrome будет соблюдать теги управления кешем и повторно использовать содержимое из кеша.
В качестве примера у меня было это приложение Ruby Sinatra:
#!/usr/bin/env ruby
require 'sinatra'
before do
content_type :txt
end
get '/' do
headers "Cache-Control" => "public, must-revalidate, max-age=3600",
"Expires" => Time.at(Time.now.to_i + (60 * 60)).to_s
"This page rendered at #{Time.now}."
end
Когда я постоянно перезагружал его на той же вкладке Chrome, он отображал новое время.
This page rendered at 2014-10-08 13:36:46 -0400.
This page rendered at 2014-10-08 13:36:48 -0400.
Заголовки выглядели так:
< HTTP/1.1 200 OK
< Content-Type: text/plain;charset=utf-8
< Cache-Control: public, must-revalidate, max-age=3600
< Expires: 2014-10-08 13:36:46 -0400
< Content-Length: 48
< X-Content-Type-Options: nosniff
< Connection: keep-alive
* Server thin is not blacklisted
< Server: thin
Однако доступ к тому же URL, http://localhost:4567/
из нескольких новых вкладок перезапустит предыдущий результат из кеша.
После выполнения некоторых тестов с Cache-Control:max-age=xxx
:
- Нажатие на кнопку перезагрузки: заголовок игнорируется
- Ввод того же URL любой вкладки (текущей или нет): уважается
- Используя JS (
window.location.reload()
): игнорируется - Использование инструментов разработчика (с отключенным отключением кэша) или инкогнито не влияет
Таким образом, лучший вариант при разработке - поместить курсор в омнибокс и нажать кнопку ввода вместо кнопки обновления.
Примечание: щелчок правой кнопкой мыши на значке обновления покажет параметры обновления (Обычный, Жесткий, Пустой кэш). Невероятно, но никто из них не влияет на эти заголовки.
Хотя этот вопрос старый, я хотел бы добавить, что если вы разрабатываете использование самозаверяющего сертификата по протоколу https и возникает проблема с сертификатом, то Google не будет кэшировать ответ независимо от того, какие заголовки кэша вы используете.
Это отмечено в отчете об ошибке: https://bugs.chromium.org/p/chromium/issues/detail?id=110649
Если инструменты разработчика Chrome открыты (F12), Chrome обычно отключает кэширование.
Это можно контролировать в настройках Developer Tools - значок Gear справа от верхней панели dev-tools.
Это дополнение к киевскому ответу
Чтобы браузер НЕ отправлял Cache-Control
заголовок в запросе, откройте хромированную консоль и введите:
location = "https://your.page.com"
Чтобы заставить браузер добавить этот заголовок, нажмите кнопку "перезагрузить".
Еще один совет:
Не забудьте проверить заголовок "Дата" - если сервер имеет неправильную дату / время (или находится в другом часовом поясе) - Chrome будет продолжать запрашивать ресурс снова и снова.
Довольно старый вопрос, но я заметил совсем недавно (2020), что Chrome иногда игнорирует заголовки Cache-Control для моих ресурсов изображений при просмотре с использованием окна инкогнито.
"Иногда", потому что в моем случае директива Cache-Control учитывалась для маленьких изображений (~60-200KB), но не для больших (10MB).
Неиспользование окна инкогнито привело к тому, что Chrome использовал кэшированную на диске версию даже для больших изображений.