Что такое 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/ это говорит мне "использовать кэширование браузера".
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 ModifiedAn
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