предисловие

Cache-Control

В отличие от модели кэширования, принятой в НТТР/1.0, НТТР/1.1 предлагает более изощренный механизм управления кэшем c помощью заголовка Cache-Control. Он обеспечивает управление процессом кэширования и со стороны отправителя, и со стороны получателя при помощи набора директив. Спецификацией протокола определено всего 12 директив. В основном директивы предназначаются только прокси-серверам и лишь некоторые из них воспринимаются и браузерами. Читать далее..

решение задач

Управление кэшированием со стороны сервера

Интернет наводнен различными статьями на тему кэширования в HTTP. И я бы не стал писать эту заметку, если бы эти статьи были исчерпывающими. Но к сожалению, все они однобоки и изобилуют ошибками. Авторы этих статей слабо отдают себе отчет в том, в рамках какой версии протокола HTTP они предлагают свои решения. Надеюсь эта заметка внесет больше ясности в столь непростой вопрос кэширования. Тем более, что в новой версии HTTP/1.1 механизм кэширования сильно усложнился и предлагает нам массу вариантов.

Основным инструментом в управлении кэшированием в HTTP/1.1 является заголовок Cache-Control. Поэтому я настоятельно рекомендую Вам сначала ознакомится с его описанием, которое я поставил в качестве предисловия к этой заметке.

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

Запрет кэширования

Я не буду сейчас рассматривать те решения, которые предлагаются другими авторами. Многие из них или не работают, или избыточны. Некоторые распространенные ошибки обсуждаются в заметке к заголовку Pragma.
Если следовать стандарту RFC 2616, то потребовать от кэшей возвращать ответ только от исходного сервера при каждом обращении можно тремя способами.

HTTP
Cache-Control: no-store
Cache-Control: no-cache
Cache-Control: max-age=0, must-revalidate

Проверка кэширования

Проверку кэширования в браузерах надо проводить правильно, иначе неверный способ может ввести Вас в заблуждение. Некоторые статьи на тему кэширования предлагают проверять кэширование страницы с помощью возврата к ней через кнопки браузера "Назад" и "Вперед". Это неправильно. Это корректно работает только в браузере Internet Explorer, и то, я не уверен, что во всех версиях. А такие браузеры как Opera и FireFox в таких случаях ВСЕГДА берут страницу из кэша, но это не значит что они игнорируют действие управляющих директив.
Еще более неправильно пользоваться клавишей F5 для обновления страницы. В этом случае, напротив, все браузеры будут перезагружать страницу, запрашивая ее с исходного сервера.
Правильный способ проверки кэширования - загрузить тестируемую страницу в новом окне браузера или новой вкладке. В этом случае вы увидите разницу между методом с помощью кнопок "Назад" и "Вперед" - браузеры Opera и FireFox будут следовать предписаниям управляющих директив, за некоторыми небольшими исключениями.

Чем по сути отличаются эти способы вы можете узнать прочитав описание заголовка Cache-Control, но результат у них будет один. В третьем способе можно обойтись и без директивы must-revalidate, большинство браузеров все равно будут обновлять кэш. Но для верности и в соответствии со стандартом не лишним будет эту директиву указать. Но эти способы не всегда работают. Например браузер Opera 8 игнорирует директиву no-store и кэширует ресурс.

Но я призываю вас не использовать все три способа одновременно. Это лишь покажет вашу безграмотность. Выберете только один, который наиболее подходит в вашей ситуации.
Я рекомендую использовать третий способ, но с указанием не нулевого срока актуальности. Ведь очень редко бывает, что ресурс меняется каждую секунду. А не редко происходит сутуация, когда пользователь в течение короткого времени возвращается к вашему ресурсу. За это время он наверняка не изменится. Определитесь с этим сроком и укажите его в директиве max-age (период актуальности указывается в секундах).

Кэширование на время

Кэшировать ресурс на определенный период можно было уже в HTTP/1.0 при помощи заголовка Expires. В HTTP/1.1 этот метод оставлен по соображениям совместимости, но предложен новый метод с директивой max-age заголовка Cache-Control, который при наличии перекрывает действие заголовка Expires. Итак, рассмотрим три варианта кэширования на время.
HTTP
Expires: Sun, 21 Feb 2010 17:28:32 +0300
Cache-Control: max-age=60, must-revalidate
Cache-Control: max-age=60, s-maxage=30, must-revalidate

В заголовке Expires должна быть указана дата будущего, когда срок актуальности ресурса истечет. Этот метод можно было бы привести в пример еще в предыдущей главе, касаемо запрета кэширования, указав в заголовке текущее время. Но, во-первых, тот факт, что актуальность ресурса истекла еще не гарантирует, что кэш его обновит. В новом протоколе есть принудительная директива must-revalidate, в старом протоколе ничего подобного нет. А, во-вторых, сегодня этот заголовок поддерживает только браузер FireFox.
Второй метод нам уже знаком из предыдущего параграфа. Его поддерживают все браузеры. Третий метод лишь расширяет его, указывая, что в совместно используемых кэшах ресурс следует обновлять чаще. При этом нет никакого смысла указывать в директивах max-age и s-maxage одинаковые значения.

Метод проверки актуальности

Этот механизм появился еще в протоколе HTTP/1.0 и успешно используется и в новом протоколе. Этот метод работает при помощи заголовков Last-Modified и If-Modified-Since. Механизм проверки актуальности реализуется в отношении ресурса с истекшим сроком актуальности. Однако его можно использовать и в отрыве от метода кэширования на время. Тогда актуальность будет проверяться при каждом запросе ресурса. Алгоритм этого метода следующий:

1. При первом требовании ресурса сервер отправляет заголовок Last-Modified, где указывает время последнего изменения.

HTTP
HTTP/1.0 200 OK
Date: Sun, 21 Feb 2010 17:28:32 +0300
Last-Modified: Sat, 20 Feb 2010 15:10:14 +0300

2. Браузер кэширует этот ресурс и при следующем требовании ресурса отправляет запрос с заголовком If-Modified-Since, в который включает дату из заголовка Last-Modified, который получил в предыдущий раз.

HTTP
GET /index.php HTTP/1.0
Date: Sun, 21 Feb 2010 21:32:52 +0300
If-Modified-Since: Sat, 20 Feb 2010 15:10:14 +0300

3. Сервер получив заголовок If-Modified-Since сверяет дату последнего изменения ресурса с датой из этого заголовка. Если дата изменилась, то происходит стандартный ответ с кодом состояния 200 OK и заголовком Last-Modified, где указывается новая дата последнего изменения (возвращаемся к пункту 1).
Если же ресурс не изменился, то сервер отвечает строкой состояния с кодом 304 Not Modified и, самое главное, не возвращает содержимого ресурса.

HTTP
HTTP/1.0 304 Not Modified
Date: Sun, 21 Feb 2010 21:33:15 +0300

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

Но это еще не все...

Эта заметка не претендует на полноту изложения вопроса. Здесь я не коснулся специфических заголовков, которые так же касаются методов проверки актуальности и кэширования. Для более полного ознакомления с вопросом кэширования в HTTP/1.1 я рекомендую прочитать описания заголовков Age и Vary, а по вопросам проверки актуальности прочитать описания заголовков Etag, If-Match, If-None-Match, Range, If-Range, If-Unmodified-Since.

Комментарии:

  1. Сегодня, 03:23

    ChrisHiz

    комментарий No. 1050

    https://www.drive2.ru/b/512143446320874353/ - Зеркало Олимп

    Ответить на комментарий..

  2. Сегодня, 01:17

    susiegn1

    комментарий No. 1049

    My unruffled engagement:
    http://love.this.site.twiclub.in

    Ответить на комментарий..

  3. Вчера, 23:58

    lalitkaErype

    комментарий No. 1048

    Еврейские девушки, женщины еврейки парни и мужчины Израиля тут


    Еврейская социальная сеть IsraFace.Com объединяет Израиль, Россию, Соединённые Штаты и другие страны. Долгое время народ Израиля бродил по пустыне и был веками разрознен, но теперь евреи снова могут быть едины независимо от расстояний. Иудеи и израильтяне в Хайфе и в Лос-Анджелесе, в Санкт-Петербурге и на Дальнем Востоке, в Мюнхене и в Будапеште теперь объединены одной социальной сетью! Если Израиль - ваша родина, если народ Израиля - это ваш народ, то IsraFace.Com создана специально для вас. Галахические евреи и потомки еврейских отцов, иудеи, олимы и коренные израильтяне, гиёрет и геры! Все возможности сайта абсолютно бесплатны. Регистрируйтесь и приглашайте близких и родственников! Назначайте свидания, заводите знакомства в Израиле, создавайте группы и сообщества по интересам, находите новых друзей. Мы ждём вас и ваших друзей! Вы собираетесь эмигрировать в Израиль? Знакомства в Израиле на IsraFace.Com - это отличный способ найти любовь на земле обетованной! Народ Израиля общителен и любвеобилен. В IsraFace.Com самые красивые еврейские девушки и женщины Израиля, горячие еврейские парни и богатые еврейские мужчины из дальних стран. Планирующие переехать в Израиль мужчины и женщины имеют возможность найти пару на IsraFace.Com. Обменивайтесь сообщениями отмечайте друзей и себя на фото, делитесь фотографиями и видео. Не упустите свой шанс обрести счастье, присоединяйтесь к IsraFace.Com ! Евреи и еврейки, набожные иудеи и израильтяне ищут вторую половинку в Израиле и по всему миру. Знакомства в Израиле стали доступны как никогда ранее! Еврейские женщины и мужчины Израиля могут встретить свою половинку в IsraFace.Com ! http://israface.com

    Ответить на комментарий..

  4. Вчера, 21:11

    Arthurbrigh

    комментарий No. 1047

    https://www.drive2.ru/b/512142346809246452/ - Зеркало 1xBet

    Ответить на комментарий..

  5. Вчера, 20:59

    AlbertBof

    комментарий No. 1046

    <b><a href=http://by.mef-ehjfor.ru>реагенты наркотические</a></b>
    <b><a href=http://by.mef-reagent.ru>реагенты это исходные продукты</a></b>
    <b><a href=http://by.reagentmdma.ru>реагенты для очистки колодцев</a></b>
    <b><a href=http://by.reagent-mef.ru>амфетамин как приготовить дома</a></b>
    <b><a href=http://by.reagenty-amf.ru>клеар блю плюс выдаёт реагент</a></b>
    <b><a href=http://by.reagenty-amf.ru>химические реагенты для хроматографии</a></b>
    <b><a href=http://by.mef-reagenty.ru>реагент для осаждение фосфора в шве</a></b>
    <b><a href=http://by.reagent-mdma.ru>амфетамин ответственность</a></b>
    <b><a href=http://by.reagent-mef.ru>амфетамин расширяет зрачок</a></b>
    <b><a href=http://by.reagent-amf.ru>скоростью спайс амфетамин</a></b>
    <b><a href=http://by.reagenty-mef.ru>хим реагенты для выделки шкур в омске</a></b>
    <b><a href=http://by.reagenty-amf.ru>амфетамин как помочь</a></b>
    <b><a href=http://by.reagentmef.ru>амфетамин в сша</a></b>
    <b><a href=http://by.mefmdma.ru>беременность или реагент</a></b>
    <b><a href=http://by.mefbutirat.ru>sysmex реагенты купить</a></b>
    <b><a href=http://by.mef-ehjfor.ru>препарат реагент для колорадского жука</a></b>
    <b><a href=http://by.reagentyamf.ru>тебя убил амфетамин</a></b>
    <b><a href=http://by.mef-reagent.ru>баг на реагенты</a></b>
    <b><a href=http://by.mefamfetamin.ru>схема атф адф амф</a></b>
    <b><a href=http://by.mefreagenty.ru>depo kolibri kavabanga амфетамин слова</a></b>

    Ответить на комментарий..

  6. Вчера, 18:04

    RobertAsype

    комментарий No. 1045

    Howdy! <a href=http://online-pharmaciescanada.com/#buy-viagra-online-no-rx-canada>meds online pharmacy</a> great site.

    Ответить на комментарий..

  7. Вчера, 15:36

    BrentAcigo

    комментарий No. 1044

    https://www.drive2.ru/users/dooopa5/ - Зеркало БК

    Ответить на комментарий..

  8. Вчера, 11:52

    DanielLox

    комментарий No. 1043

    https://www.drive2.ru/b/000000/ - Зеркало Париматч работающее на сегодня.

    Ответить на комментарий..

  9. Вчера, 09:54

    AlexPoeva

    комментарий No. 1042

    Ваш сайт это убогое говно, вы его сами делали или заплатили криворукому студенту?
    Я делаю крутые сайты профессионально и дешево!!! Телефон +79169295582 или 879169295582 по россии. Звоните! Скидка только сейчас!
    Слыш, мудак, сайт закажи или зассал терпила? Маму твою ебал.
    Скидка только сейчас, консультация бесплатно. Примеры работ по запросу.
    Александр

    Ответить на комментарий..

  10. Вчера, 09:44

    DanielLox

    комментарий No. 1041

    [url=https://www.drive2.ru/b/000000/]Зеркало Париматч[/url] работающее на сегодня.

    Ответить на комментарий..

Ваш комментарий