Что такое Cache-Control: private?



когда я посещаю 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


Так что кажется, что кэширование работает. Если это работает для кэширования, то в чем смысл истекает и Cache-Control: max-age. Чтобы добавить путаницы, когда я тестирую страницу на https://developers.google.com/speed/pagespeed/insights/ это говорит мне "использовать кэширование браузера".

776   4  

4 ответов:

Cache-Control: private

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

С адресу rfc2616 14.9.1

чтобы ответить на ваш вопрос о том, почему кэширование работает, даже если веб-сервер не включать заголовки:

  • истекает:[a date]
  • Cache-Control: max-age=[seconds]

сервер любезно попросил любые промежуточные прокси не кэшировать содержимое (т. е. элемент должен быть кэширован только в частная кэш, т. е. только на локальном машина):

  • Cache-Control: private

но сервер забыл включить какие-либо подсказки кэширования:

  • они забыли включить истекает, так что браузер знает, чтобы использовать кэшированную копию до этой даты
  • они забыли включить Макс-Возраст, так что браузер знает, как долго кэшированный элемент хорош для
  • они забыли включить E-Tag, так что браузер может сделать условный запрос

но они включали в себя Последнего Изменения дата в ответ:

Last-Modified: Tue, 16 Oct 2012 03:13:38 GMT

поскольку браузер знает дату изменения файла, он может выполнить "условный запрос". Он запросит у сервера файл, но попросит сервер отправить файл только в том случае, если он был изменен с 2012/10/16 3:13:38:

GET / HTTP/1.1
If-Modified-Since: Tue, 16 Oct 2012 03:13:38 GMT

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

304 Not Modified

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

почему Макс-Возраст? Почему истекает?

, потому что Последнего Изменения хреново.

не все на сервере и дата, связанная с ним. Если я строю страницу на лету, нет никакой даты, связанной с ним - это теперь. Но я совершенно готов позволить пользователю кэшировать домашнюю страницу в течение 15 секунд:

200 OK
Cache-Control: max-age=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):

  • Expires: вы указываете дату (ой)
  • max-age: укажите секунд (благость)
  • и если и указаны, то браузер использует max-age:

    200 OK
    Cache-Control: max-age=60
    Expires: 20180403T192837 
    

любой веб-сайт, написанный после 1998 года, не должен использовать Expires больше, и вместо того, чтобы использовать max-age.

что такое ETag?

ETag похож на Последнего Изменения, за исключением того, что это не обязательно должна быть дата - это просто должно быть что-то.

если я вытаскиваю список продуктов из базы данных, сервер может отправить последний rowversion как ETag, а не дата:

200 OK
ETag: "247986"

мой ETag может быть хэшем SHA1 статического ресурса (например, image, js, css, font) или кэшированной отображаемой страницы (т. е. это то, что делает Mozilla MDN wiki; они хэшируют окончательную разметку):

200 OK
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"

и точно так же, как в случае условного запроса на основе Последнего Изменения:

GET / HTTP/1.1
If-Modified-Since: Tue, 16 Oct 2012 03:13:38 GMT

304 Not Modified

выполнить условный запрос на основе ETag:

GET / HTTP/1.1
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"

304 Not Modified

An ETag превосходит Last-Modified потому что это работает для вещей, кроме файлы, или вещи, которые не имеют понятие дата. Это просто и

RFC 2616,14.9.1:

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


- браузеры могут использовать эту информацию. Конечно, текущий "пользователь" может означать многое: пользователь ОС, пользователь браузера (например, профили Chrome) и т. д. Это не уточняется.

для меня более конкретный пример на Cache-Control: private Это прокси-серверы (которые обычно имеют много пользователей) не будут кэшировать его. Он предназначен для конечного пользователя, и никто другой.


FYI, RFC дает понять, что это не обеспечивает безопасность. Это примерно показывает правильное содержимое, не обеспечивающих содержание.

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

в поле Expires entity-header указывается дата / время, после которого ответ считается устаревшим.Поле Cache-control:maxage дает значение возраста (в секундах) больше, чем ответ, который считается устаревшим.

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

чтобы решить эту проблему, HTTP1.1 дает последнюю модифицированную головку. Сервер выдает клиенту последнюю измененную дату ответа. Когда клиенту нужен этот ресурс, он отправит поле If-Modified-Since head на сервер. Если эта дата предшествует измененной дате ресурса, сервер отправляет ресурс клиенту и выдает код 200.В противном случае он возвращает 304 код клиенту, и это означает, что клиент может использовать ресурсов в кэше.

Comments

    Ничего не найдено.