Http кэширование

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

Первое, на мой взгляд что нужно сделать — это установить заголовок Cache-Control в private или public. Если поставить private (что по умолчанию), то кэшировать разрешается только браузеру. Если public то кэшировать могут так же и прокси сервера.
Примечание: public действует как private, если требуется http аутентификация.
Второе ставим так же заголовок Cache-Control max-age=N (и еще s-max-age если для прокси сервера нужно установить другое время). N — это количество секунд, сколько страница будет считаться свежей и браузер(прокси сервер), не будет отправлять запрос на веб сервер. По умолчанию это значение равно 0.

В принципе используя только эти два значения можно уже настроить кэширование. Например, отправим такие заголовки клиенту (1.0*):

HTTP/1.1 200 OK
Cache-Control: private
Cache-Control: max-age=7200

Итак Cache-Control: private говорит о том, чтоб браузер сохранил ответ в кэше. Если пользователь запросит ту же самую страницу, то браузер отдаст ее из кэша. И только по истечению двух часов, браузер запросит проверить страницу на изменение (сделать валидацию). И так браузер делает такой запрос (2.0*):

Cache-Control: max-age=0

Заметьте этот заголовок уже отправляет браузер. max-age=0 говорит о том что браузер хочет чтобы сервер сделал валидацию ответа. Если например браузер отослал max-age=3600, то он как бы говорит можешь не делать валидацию своего документа, если у тебя он не старше чем 1 час и можешь отдать мне свой закэшированный документ. За валидацию отвечает заголовок ETag.

Примечание: так как у нас в ответах еще не было заголовка ETag, то и никаких валидаций документов не будет. Сервер сразу будет генерить новые документы. Заголовок ETag будет описан следующим.

ETag — это хэш страницы. Он позволяет определить изменилась страница или нет. Добавим это заголовок в ответ сервера (1.1*):

HTTP/1.1 200 OK
Cache-Control: private
Cache-Control: max-age=7200
ETag: "11c415a-8206-243aea40"

Теперь по истечению двух часов браузер будет отсылать такие заголовки (2.1*):

Cache-Control: max-age=0
If-None-Match:"11c415a-8206-243aea40"

Сервер делает валидацию и если документ не изменился отсылает

HTTP/1.1 304 Not Modified

А если изменился то отсылает новый документ

HTTP/1.1 200 OK
Cache-Control: private
Cache-Control: max-age=7200
ETag: "0192384-9023-1a929893"

Другие примеры. Пример (1.3*):

HTTP/1.1 200 OK
Cache-Control: private
Cache-Control: max-age=0
ETag: "11c415a-8206-243aea40"

Сервер говорит клиенту что документ нужно валидировать через 0 секунд, то есть сразу. Вместо заголовка max-age=0 лучше использовать заголовок no-cache, так как некоторые конфигурации http все же позволяют отдавать устаревший документ без валидации. Пример (1.4*):

HTTP/1.1 200 OK
Cache-Control: private
Cache-Control: no-cache
ETag: "11c415a-8206-243aea40"

Заголовок no-cache может запутать. Сервер говорит браузеру не то чтобы не кэшировать документ, а то чтобы делать всегда валидацию. То есть браузер так же кэширует документ. Но прежде чем его показать делает запрос на сервер, чтобы проверить а не изменился ли он.
Но есть еще один интересный заголовок max-stale=N, который может еще больше запутать. Этот заголовок может отправить клиент после того как получил заголовок no-cache от сервера. То есть клиент просит у сервера так: может все таки ты отдашь мне документ без валидации если он не старше 1 часа, и сервер услышав такие просьбы может отдать документ без валидации.
Поэтому вместо no-cache лучше отправлять такие заголовки (1.5*):

HTTP/1.1 200 OK
Cache-Control: private
Cache-Control: must-revalidate, max-age=0
ETag: "11c415a-8206-243aea40"

Теперь клиент знает что заголовок max-stale отправлять смысла нет. То есть must-revalidate говорит что нужно обязательно валидировать и говорит клиенту что тот не должен отправлять max-stale.

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

Есть старые заголовки, заимствованные от HTTP 1.0 — Expires, Last-Modified и If-Modified-Since. Expires — аналог max-age, Last-Modified и If-Modified-Since аналоги ETag и If-None-Match
Ссылки:

По теме:
Запускаем asp.net-mvc приложения в vs в разных средах

В mvc приложении есть файл Web.config который отвечает за главные настройки приложения. И есть файлы Web.Debug.config и Web.Release.config, которые переопределяют Read more

Выполняем get запрос по расписанию c#

Напишем простенькую программу, которая будет выполнять get запрос по истечению определенного интервала времени. class Program { private static Timer _timer; Read more

Выполняем действие по расписанию (asp.net, c#)

Раньше я писал программку, которая выполняла get запрос по расписанию, но так же можно написать обычный HttpModule, который будет делать Read more

Выбираем технологии и инструменты для разработки веб приложений

1 Выбор и настройка инструментов для разработки фронтенда (только самые важные): 1.1 Twitter bootstrap — фреймворк позволяет писать качественную верстку Read more

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *