Когда я посещаю chesseng.herokuapp.com, я получаю заголовок ответа, который выглядит как
Cache-Control:private
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/css
Date:Tue, 16 Oct 2012 06:37:53 GMT
Last-Modified:Tue, 16 Oct 2012 03:13:38 GMT
Status:200 OK
transfer-encoding:chunked
Vary:Accept-Encoding
X-Rack-Cache:miss
а потом я обновляю страницу и получаю
Cache-Control:private
Connection:keep-alive
Date:Tue, 16 Oct 2012 06:20:49 GMT
Status:304 Not Modified
X-Rack-Cache:miss
так что похоже кеширование работает. Если это работает для кеширования, то в чем смысл Expires и Cache-Control: max-age . Чтобы добавить путаницу, когда я тестирую страницу на https://developers.google.com/speed/pagespeed/insights/, он говорит мне: «Использовать кэширование в браузере».
http
caching
http-headers
browser-cache
cache-control
user782220
источник
источник
Ответы:
Чтобы ответить на ваш вопрос о том, почему кеширование работает, хотя веб-сервер не включает заголовки:
[a date]
[seconds]
Сервер любезно попросил любые промежуточные прокси не кэшировать содержимое (т.е. элемент должен кэшироваться только в частном кэше, т.е. только на вашем локальном компьютере):
Но сервер забыл включить любые подсказки кэширования:
Но они включили дату последнего изменения в ответ:
Поскольку браузер знает дату, когда файл был изменен, он может выполнить условный запрос . Он запросит файл у сервера, но прикажет серверу отправлять файл, только если он был изменен с 2012/10/16 3:13:38:
Сервер получает запрос, понимает, что у клиента уже самая последняя версия. Вместо того, чтобы отправлять клиента
200 OK
, а затем содержимое страницы, вместо этого он сообщает, что ваша кэшированная версия хороша:Ваш браузер должен был перенести задержку отправки запроса на сервер и дождаться ответа, но он избавил от необходимости повторно загружать статический контент.
Почему Макс-Эйдж ? Почему истекает ?
Потому что Last-Modified отстой.
Не все на сервере имеют дату, связанную с ним. Если я создаю страницу на лету, дата с ней не связана - сейчас . Но я совершенно готов позволить пользователю кэшировать домашнюю страницу на 15 секунд:
Если пользователь забьет F5, он получит кэшированную версию в течение 15 секунд. Если это корпоративный прокси-сервер, то все 67198 пользователей, попадающих на одну и ту же страницу в одном и том же 15-секундном окне, получат одинаковое содержимое - все из закрытого кэша. Спектакль победит всех.
Преимущество добавления
Cache-Control: max-age
заключается в том, что браузер даже не должен выполнять условный запрос.Last-Modified
, браузер должен выполнить запросIf-Modified-Since
и следить за304 Not Modified
ответомmax-age
, браузеру даже не придется страдать в сети; контент выйдет прямо из кешаРазница между "Cache-Control: max-age" и "Expires"
Expires
является устаревшим эквивалентом современного (c. 1998)Cache-Control: max-age
заголовка:Expires
: вы указываете дату (гадость)max-age
: вы указываете секунды (доброта)И если оба указаны, то браузер использует
max-age
:Любой веб-сайт, написанный после 1998 года, не должен
Expires
больше использоваться , а должен использоватьсяmax-age
.Что такое ETag?
ETag похож на Last-Modified , за исключением того, что он не обязательно должен быть датой - он просто должен быть чем-то .
Если я вытаскиваю список продуктов из базы данных, сервер может отправлять последние
rowversion
как ETag, а не как дату:Мой ETag может быть хешем SHA1 статического ресурса (например, изображения, js, css, шрифта) или кэшированной визуализированной страницы (то есть, именно это и делает вики Mozilla MDN; они хэшируют окончательную разметку):
И так же, как в случае условного запроса на основе Last-Modified :
Я могу выполнить условный запрос на основе ETag:
An
ETag
превосходит,Last-Modified
потому что он работает для вещей помимо файлов , или вещей, которые имеют понятие даты . Это как раз являетсяисточник
cache-control
не существует? И у вас есть только Etag? Разве ему не нужно делать «условный запрос» к серверу? Поведение, которое я наблюдаю в автономном режиме, заключается в том, что он просто возвращается из кэша. Но когда он не в сети, он не может сделать этот условный запрос. Так значит ли это, что он будет кешироваться бесконечно, если вы останетесь в автономном режиме? Я уже задавал этот вопрос подробно здесь . Вы можете посмотреть?Из RFC2616 раздел 14.9.1
источник
Cache-Control:private
только состояния, в которых используются общие кэши (например, прокси-кэши), не должны кэшировать ответ.proxy-revalidate
требует, чтобы прокси-серверы всегда проходили повторную проверку при каждом доступе. Где какprivate
мешает прокси от кеширования.RFC 2616, раздел 14.9.1 :
Браузеры могут использовать эту информацию. Конечно, текущий «пользователь» может означать много вещей: пользователь ОС, пользователь браузера (например, профили Chrome) и т. Д. Он не указан.
Для меня более конкретный пример из
Cache-Control: private
является то , что прокси - серверы (которые , как правило , имеют много пользователей) не кэшировать. Он предназначен для конечного пользователя, и никто другой.К вашему сведению, RFC ясно дает понять, что это не обеспечивает безопасность. Речь идет о показе правильного контента, а не о защите контента.
источник
В поле заголовка объекта Expires указывается дата / время, после которого ответ считается устаревшим. Поле Cache-control: maxage дает значение возраста (в секундах), которое больше, чем ответ считается устаревшим.
Хотя вышеупомянутое поле заголовка предоставляет клиенту механизм, чтобы решить, следует ли отправлять запрос на сервер. В некоторых условиях клиент отправляет запрос на разрыв, и возрастное значение ответа превышает максимальное значение, то есть доза означает, что серверу необходимо отправить ресурс клиенту? Возможно, ресурс никогда не менялся.
Для решения этой проблемы HTTP1.1 дает заголовок с последним изменением. Сервер предоставляет дату последнего изменения ответа клиенту. Когда клиенту нужен этот ресурс, он отправит поле заголовка If-Modified-Since на сервер. Если эта дата предшествует дате изменения ресурса, сервер отправит ресурс клиенту и даст 200 кодов. В противном случае он вернет клиенту код 304, и это означает, что клиент может использовать кэшированный ресурс.
источник