HTTP-кеÑиÑование
ÐÑоизводиÑелÑноÑÑÑ Ð²ÐµÐ±-ÑайÑов и пÑиложений можно знаÑиÑелÑно повÑÑиÑÑ Ð·Ð° ÑÑÑÑ Ð¿Ð¾Ð²ÑоÑного иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñанее полÑÑеннÑÑ ÑеÑÑÑÑов. Ðеб-кеÑи ÑокÑаÑаÑÑ Ð·Ð°Ð´ÐµÑÐ¶ÐºÑ Ð¸ ÑнижаÑÑ ÑеÑевой ÑÑаÑик, ÑменÑÑÐ°Ñ Ñем ÑамÑм вÑемÑ, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾Ðµ Ð´Ð»Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑеÑÑÑÑов. ÐÑполÑзÑÑ HTTP-кеÑиÑование, ÑайÑÑ ÑÑановÑÑÑÑ Ð±Ð¾Ð»ÐµÐµ оÑзÑвÑивÑми.
РазлиÑнÑе Ð²Ð¸Ð´Ñ ÐºÐµÑиÑованиÑ
Ð¢ÐµÑ Ð½Ð¸ÐºÐ° кеÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°ÐºÐ»ÑÑаеÑÑÑ Ð² ÑÐ¾Ñ Ñанении копии полÑÑенного ÑеÑÑÑÑа Ð´Ð»Ñ Ð²Ð¾Ð·Ð²ÑаÑа ÑÑой копии в оÑÐ²ÐµÑ Ð½Ð° далÑнейÑие запÑоÑÑ. ÐапÑÐ¾Ñ Ð½Ð° ÑеÑÑÑÑ, Ñже имеÑÑийÑÑ Ð² веб-кеÑе, пеÑÐµÑ Ð²Ð°ÑÑваеÑÑÑ, и вмеÑÑо обÑаÑÐµÐ½Ð¸Ñ Ðº иÑÑ Ð¾Ð´Ð½Ð¾Ð¼Ñ ÑеÑвеÑÑ Ð²ÑполнÑеÑÑÑ Ð·Ð°Ð³ÑÑзка копии из кеÑа. Таким обÑазом ÑнижаеÑÑÑ Ð½Ð°Ð³ÑÑзка на ÑеÑвеÑ, коÑоÑÐ¾Ð¼Ñ Ð½Ðµ пÑÐ¸Ñ Ð¾Ð´Ð¸ÑÑÑ ÑÐ°Ð¼Ð¾Ð¼Ñ Ð¾Ð±ÑлÑживаÑÑ Ð²ÑÐµÑ ÐºÐ»Ð¸ÐµÐ½Ñов, и повÑÑаеÑÑÑ Ð¿ÑоизводиÑелÑноÑÑÑ â ÐºÐµÑ Ð±Ð»Ð¸Ð¶Ðµ к клиенÑÑ Ð¸ ÑеÑÑÑÑ Ð¿ÐµÑедаÑÑÑÑ Ð±ÑÑÑÑее. ÐеÑиÑование ÑвлÑеÑÑÑ Ð¾ÑновнÑм иÑÑоÑником повÑÑÐµÐ½Ð¸Ñ Ð¿ÑоизводиÑелÑноÑÑи веб-ÑайÑов. Ðднако, ÐºÐµÑ Ð½Ð°Ð´Ð¾ пÑавилÑно ÑконÑигÑÑиÑоваÑÑ: ÑеÑÑÑÑÑ Ñедко оÑÑаÑÑÑÑ Ð½ÐµÐ¸Ð·Ð¼ÐµÐ½Ð½Ñми, Ñак ÑÑо ÐºÐ¾Ð¿Ð¸Ñ ÑÑебÑеÑÑÑ Ñ ÑаниÑÑ ÑолÑко до Ñого моменÑа, как ÑеÑÑÑÑ Ð¸Ð·Ð¼ÐµÐ½Ð¸Ð»ÑÑ, но не долÑÑе.
СÑÑеÑÑвÑÐµÑ Ð½ÐµÑколÑко видов кеÑей, коÑоÑÑе можно ÑазделиÑÑ Ð½Ð° две оÑновнÑе каÑегоÑии: пÑиваÑнÑе кеÑи и кеÑи ÑовмеÑÑного иÑполÑзованиÑ. РкеÑÐ°Ñ ÑовмеÑÑного иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ (shared cache) Ñ ÑанÑÑÑÑ ÐºÐ¾Ð¿Ð¸Ð¸, коÑоÑÑе могÑÑ Ð½Ð°Ð¿ÑавлÑÑÑÑÑ ÑазнÑм полÑзоваÑелÑм. ÐÑиваÑнÑй ÐºÐµÑ (private cache) пÑедназнаÑен Ð´Ð»Ñ Ð¾ÑделÑного полÑзоваÑелÑ. ÐдеÑÑ Ð±ÑÐ´ÐµÑ Ð³Ð¾Ð²Ð¾ÑиÑÑÑÑ Ð² оÑновном о кеÑÐ°Ñ Ð±ÑаÑзеÑов и пÑокÑи, но ÑÑÑеÑÑвÑÑÑ Ñакже кеÑи ÑлÑзов, CDN, ÑевеÑÑнÑе пÑокÑи кеÑи и баланÑиÑовÑики нагÑÑзки, ÑазвоÑаÑиваемÑе на ÑеÑвеÑÐ°Ñ Ð´Ð»Ñ Ð¿Ð¾Ð²ÑÑÐµÐ½Ð¸Ñ Ð½Ð°Ð´ÑжноÑÑи, пÑоизводиÑелÑноÑÑи и маÑÑÑабиÑÑемоÑÑи веб-ÑайÑов и веб-пÑиложений.

ÐÑиваÑнÑй (private) ÐºÐµÑ Ð±ÑаÑзеÑа
ÐÑиваÑнÑй ÐºÐµÑ Ð¿ÑедназнаÑен Ð´Ð»Ñ Ð¾ÑделÑного полÑзоваÑелÑ. ÐÑ, возможно, Ñже видели паÑамеÑÑÑ ÐºÐµÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð² наÑÑÑÐ¾Ð¹ÐºÐ°Ñ Ñвоего бÑаÑзеÑа. ÐÐµÑ Ð±ÑаÑзеÑа ÑодеÑÐ¶Ð¸Ñ Ð²Ñе докÑменÑÑ, загÑÑженнÑе полÑзоваÑелем по HTTP. Ðн иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð´Ð¾ÑÑÑпа к Ñанее загÑÑженнÑм ÑÑÑаниÑам пÑи навигаÑии назад/впеÑÑд, позволÑÐµÑ ÑÐ¾Ñ ÑанÑÑÑ ÑÑÑаниÑÑ, или пÑоÑмаÑÑиваÑÑ Ð¸Ñ ÐºÐ¾Ð´, не обÑаÑаÑÑÑ Ð»Ð¸Ñний Ñаз к ÑеÑвеÑÑ. ÐÑоме Ñого, ÐºÐµÑ Ð¿Ð¾Ð»ÐµÐ·ÐµÐ½ пÑи оÑклÑÑении Ð¾Ñ ÑеÑи.
ÐбÑий (shared) пÑокÑи-кеÑ
ÐÐµÑ ÑовмеÑÑного иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ â ÑÑо кеÑ, коÑоÑÑй ÑÐ¾Ñ ÑанÑÐµÑ Ð¾ÑвеÑÑ, ÑÑÐ¾Ð±Ñ Ð¸Ñ Ð¿Ð¾Ñом могли иÑполÑзоваÑÑ ÑазнÑе полÑзоваÑели. ÐапÑимеÑ, в локалÑной ÑеÑи ваÑего пÑовайдеÑа или компании, Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑÑÑановлен пÑокÑи, обÑлÑживаÑÑий множеÑÑво полÑзоваÑелей, ÑÑÐ¾Ð±Ñ Ð¼Ð¾Ð¶Ð½Ð¾ бÑло повÑоÑно иÑполÑзоваÑÑ Ð¿Ð¾Ð¿ÑлÑÑнÑе ÑеÑÑÑÑÑ, ÑокÑаÑÐ°Ñ Ñем ÑамÑм ÑеÑевой ÑÑаÑик и вÑÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ.
Цели кеÑиÑованиÑ
ÐеÑиÑование в HTTP не ÑвлÑеÑÑÑ Ð¾Ð±ÑзаÑелÑнÑм, однако в болÑÑинÑÑве ÑлÑÑаев бÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ повÑоÑно иÑполÑзоваÑÑ Ñанее ÑоÑ
ÑанÑннÑе ÑеÑÑÑÑÑ. Тем не менее, ÑÑандаÑÑнÑе кеÑи HTTP обÑÑно ÑпоÑÐ¾Ð±Ð½Ñ ÐºÐµÑиÑоваÑÑ ÑолÑко оÑвеÑÑ Ð½Ð° запÑоÑÑ Ð¼ÐµÑодом GET, а дÑÑгие оÑклонÑÑÑ.
ÐеÑвиÑнÑй клÑÑ ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· меÑода запÑоÑа и запÑаÑиваемого URI (заÑаÑÑÑÑ Ð¸ÑполÑзÑеÑÑÑ ÑолÑко URI, поÑколÑÐºÑ ÑелÑÑ ÐºÐµÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑвлÑÑÑÑÑ ÑолÑко GET-запÑоÑÑ). ÐÐ¾Ñ Ð¿ÑимеÑÑ Ñого, ÑÑо обÑÑно запиÑÑваеÑÑÑ Ð² кеÑ:
- УÑпеÑно загÑÑженнÑе ÑеÑÑÑÑÑ: оÑвеÑ
200OKна запÑÐ¾Ñ Ð¼ÐµÑодомGETHTML-докÑменÑов, изобÑажений или Ñайлов. - ÐоÑÑоÑннÑе пеÑенапÑавлениÑ: оÑвеÑ
301Moved Permanently(«пеÑемеÑено навÑегда»). - СообÑÐµÐ½Ð¸Ñ Ð¾Ð± оÑибкаÑ
: оÑвеÑ
404Not Found(«не найдено»). - ÐеполнÑе ÑезÑлÑÑаÑÑ: оÑвеÑ
206Partial Content(«ÑаÑÑиÑное ÑодеÑжимое»). - ÐÑвеÑÑ Ð½Ð° запÑоÑÑ Ð¾ÑлиÑнÑе оÑ
GET, еÑли еÑÑÑ ÑÑо-либо, Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑее Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² каÑеÑÑве клÑÑа кеÑа.
ÐапиÑÑ Ð² кеÑе Ð¼Ð¾Ð¶ÐµÑ Ñакже ÑоÑÑоÑÑÑ Ð¸Ð· множеÑÑва оÑвеÑов, ÑазлиÑаемÑÑ
по вÑоÑиÑÐ½Ð¾Ð¼Ñ ÐºÐ»ÑÑÑ, еÑли пÑи ÑоÑмиÑовании оÑвеÑа пÑоизводиÑÑÑ ÑоглаÑование даннÑÑ
. ÐодÑобнее об ÑÑом ÑаÑÑказано ниже, в Ñазделе, поÑвÑÑÑнном Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÑ Vary.
УпÑавление кеÑиÑованием
>Ðаголовок Cache-control
Ðоле Cache-Control обÑего заголовка HTTP/1.1 иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð¸Ð½ÑÑÑÑкÑий по меÑ
Ð°Ð½Ð¸Ð·Ð¼Ñ ÐºÐµÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ°Ðº в запÑоÑаÑ
, Ñак и в оÑвеÑаÑ
. ÐÑименÑеÑÑÑ Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð»Ð¸Ñик кеÑиÑованиÑ.
Ðолное оÑÑÑÑÑÑвие кеÑиÑованиÑ
РкеÑе не должно ÑÐ¾Ñ ÑанÑÑÑÑÑ Ð½Ð¸Ñего â ни по запÑоÑам клиенÑа, ни по оÑвеÑам ÑеÑвеÑа. ÐапÑÐ¾Ñ Ð²Ñегда оÑпÑавлÑеÑÑÑ Ð½Ð° ÑеÑвеÑ, оÑÐ²ÐµÑ Ð²Ñегда загÑÑжаеÑÑÑ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ.
Cache-Control: no-store Cache-Control: no-cache, no-store, must-revalidate
ÐеÑиÑоваÑÑ, но пÑовеÑÑÑÑ Ð°ÐºÑÑалÑноÑÑÑ
ÐеÑед Ñем, как вÑдаÑÑ ÐºÐ¾Ð¿Ð¸Ñ, ÐºÐµÑ Ð·Ð°Ð¿ÑаÑÐ¸Ð²Ð°ÐµÑ Ð¸ÑÑ Ð¾Ð´Ð½Ñй ÑеÑÐ²ÐµÑ Ð½Ð° пÑÐµÐ´Ð¼ÐµÑ Ð°ÐºÑÑалÑноÑÑи ÑеÑÑÑÑа.
Cache-Control: no-cache
ÐÑиваÑнÑе (private) и обÑие (public) кеÑи
ÐиÑекÑива "public" ÑказÑваеÑ, ÑÑо оÑÐ²ÐµÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑÐ¾Ñ ÑанÑÑÑ Ð² лÑбом кеÑе. ÐÑо бÑÐ²Ð°ÐµÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾, еÑли Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð¿Ð¾ÑÑебноÑÑÑ ÑÐ¾Ñ ÑаниÑÑ ÑÑÑаниÑÑ Ñ HTTP-аÑÑенÑиÑикаÑией, или Ñакими кодами оÑвеÑа, коÑоÑÑе обÑÑно не кеÑиÑÑÑÑÑÑ. ÐиÑекÑива же "private" ÑказÑваеÑ, ÑÑо оÑÐ²ÐµÑ Ð¿ÑедназнаÑен оÑделÑÐ½Ð¾Ð¼Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð¸ не должен Ñ ÑаниÑÑÑÑ Ð² кеÑе ÑовмеÑÑного иÑполÑзованиÑ. Ð ÑÑом ÑлÑÑае оÑÐ²ÐµÑ Ð¼Ð¾Ð¶ÐµÑ ÑÐ¾Ñ ÑанÑÑÑÑÑ Ð¿ÑиваÑнÑм кеÑем бÑаÑзеÑа.
Cache-Control: private Cache-Control: public
СÑок дейÑÑÐ²Ð¸Ñ (Expiration)
Самой важной здеÑÑ ÑвлÑеÑÑÑ Ð´Ð¸ÑекÑива "max-age=<seconds>" â макÑималÑное вÑемÑ, в ÑеÑение коÑоÑого ÑеÑÑÑÑ ÑÑиÑаеÑÑÑ "Ñвежим". РоÑлиÑие Ð¾Ñ Ð´Ð¸ÑекÑÐ¸Ð²Ñ Expires, она пÑивÑзана к моменÑÑ Ð·Ð°Ð¿ÑоÑа. РнеизменÑÑÑимÑÑ Ñайлам пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾Ð±ÑÑно можно пÑименÑÑÑ "агÑеÑÑивное" кеÑиÑование. ÐÑимеÑом ÑакиÑ
ÑÑаÑиÑеÑкиÑ
Ñайлов могÑÑ Ð±ÑÑÑ Ð¸Ð·Ð¾Ð±ÑажениÑ, ÑÐ°Ð¹Ð»Ñ ÑÑилей (CSS) или ÑкÑипÑов (JavaScript).
ÐодÑобнее об ÑÑом ÑаÑÑказÑваеÑÑÑ Ð² Ñазделе СвежеÑÑÑ ÑеÑÑÑÑа.
Cache-Control: max-age=31536000
ÐÑовеÑка акÑÑалÑноÑÑи
ÐÑи иÑполÑзовании диÑекÑÐ¸Ð²Ñ "must-revalidate" ÐºÐµÑ Ð¾Ð±Ñзан пÑовеÑÑÑÑ ÑÑаÑÑÑ ÑеÑÑÑÑов Ñ Ð¸ÑÑÑкÑим ÑÑоком дейÑÑвиÑ. Те копии, ÑÑо ÑÑÑаÑили акÑÑалÑноÑÑÑ, иÑполÑзоваÑÑÑÑ Ð½Ðµ должнÑ. ÐодÑобнее об ÑÑом ÑаÑÑказано ниже, в Ñазделе ÐалидаÑÐ¸Ñ ÐºÐµÑа.
Cache-Control: must-revalidate
Ðаголовок Pragma
Pragma ÑвлÑеÑÑÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¾Ð¼ HTTP/1.0. Ðн не опиÑан Ð´Ð»Ñ HTTP-оÑвеÑов и, Ñаким обÑазом, не Ð¼Ð¾Ð¶ÐµÑ ÑлÑжиÑÑ Ð½Ð°Ð´Ñжной заменой обÑÐµÐ¼Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÑ Cache-Control пÑоÑокола HTTP/1.1, Ñ
оÑÑ ÐµÐ³Ð¾ поведение аналогиÑно "Cache-Control: no-cache" когда поле заголовка Cache-Control опÑÑено в запÑоÑе. ÐÑполÑзоваÑÑ ÐµÐ³Ð¾ ÑледÑÐµÑ ÑолÑко Ð´Ð»Ñ ÑовмеÑÑимоÑÑи Ñ ÐºÐ»Ð¸ÐµÐ½Ñами HTTP/1.0.
СвежеÑÑÑ ÑÐ¾Ñ ÑанÑнной копии
ÐÐ´Ð½Ð°Ð¶Ð´Ñ Ð¿Ð¾Ð¿Ð°Ð² в кеÑ, ÑеÑÑÑÑ, ÑеоÑеÑиÑеÑки, Ð¼Ð¾Ð¶ÐµÑ Ñ
ÑаниÑÑÑÑ Ñам веÑно. Ðднако, поÑколÑÐºÑ Ð¾Ð±Ñем Ñ
ÑанилиÑа конеÑен, запиÑи пеÑиодиÑеÑки пÑиÑ
одиÑÑÑ Ð¾ÑÑÑда ÑдалÑÑÑ. ÐÑÐ¾Ñ Ð¿ÑоÑеÑÑ Ð½Ð°Ð·ÑваÑÑ Ð²ÑÑеÑнением даннÑÑ
из кеÑа (cache eviction). ÐÑоме Ñого, ÑеÑÑÑÑÑ Ð¼Ð¾Ð³ÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑÑÑ Ð½Ð° ÑеÑвеÑе, поÑÑÐ¾Ð¼Ñ ÐºÐµÑ ÑÑебÑеÑÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÑÑÑ. ÐоÑколÑÐºÑ HTTP ÑвлÑеÑÑÑ ÐºÐ»Ð¸ÐµÐ½Ñ-ÑеÑвеÑнÑм пÑоÑоколом, ÑеÑвеÑа не могÑÑ Ñами обÑаÑаÑÑÑÑ Ðº кеÑам и клиенÑам пÑи изменении ÑеÑÑÑÑа; им необÑ
одимо договоÑиÑÑÑÑ Ð¾ ÑÑоке дейÑÑÐ²Ð¸Ñ ÑоÑ
ÑанÑнной копии. Ðо его иÑÑеÑÐµÐ½Ð¸Ñ ÑеÑÑÑÑ ÑÑиÑаеÑÑÑ Ñвежим (fresh), поÑле â ÑÑÑаÑевÑим (stale). ÐлгоÑиÑÐ¼Ñ Ð²ÑÑеÑÐ½ÐµÐ½Ð¸Ñ Ð¾ÑдаÑÑ Ð¿ÑедпоÑÑение "Ñвежим" ÑеÑÑÑÑам. Тем не менее, ÐºÐ¾Ð¿Ð¸Ñ ÑеÑÑÑÑа не ÑдалÑеÑÑÑ Ð¸Ð· кеÑа ÑÑÐ°Ð·Ñ Ð¶Ðµ по иÑÑеÑении ÐµÑ ÑÑока дейÑÑвиÑ; пÑи полÑÑении запÑоÑа на ÑÑÑаÑевÑий ÑеÑÑÑÑ ÐºÐµÑ Ð¿ÐµÑедаÑÑ ÐµÐ³Ð¾ далÑÑе Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¾Ð¼ If-None-Match на ÑлÑÑай, еÑли ÐºÐ¾Ð¿Ð¸Ñ Ð²Ñе еÑÑ Ð°ÐºÑÑалÑна. ÐÑли ÑÑо Ñак, ÑеÑÐ²ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑÐ°ÐµÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº 304 Not Modified («не изменÑлоÑÑ»), а Ñело ÑеÑÑÑÑа не поÑÑлаеÑ, ÑÐºÐ¾Ð½Ð¾Ð¼Ñ Ñем ÑамÑм ÑÑаÑик.
ÐÐ¾Ñ Ð¿ÑÐ¸Ð¼ÐµÑ Ñого, как пÑоÑÐµÐºÐ°ÐµÑ ÑÑÐ¾Ñ Ð¿ÑоÑеÑÑ Ð¿Ñи иÑполÑзовании ÑовмеÑÑного кеÑа пÑокÑи:

СÑок дейÑÑÐ²Ð¸Ñ (freshnessLifetime) вÑÑиÑлÑеÑÑÑ Ð½Ð° оÑновании неÑколÑкиÑ
заголовков. ÐÑли задан заголовок "Cache-control: max-age=N", Ñо ÑÑок дейÑÑÐ²Ð¸Ñ Ñавен N. ÐÑли его неÑ, а ÑÑо бÑÐ²Ð°ÐµÑ Ð¾ÑÐµÐ½Ñ ÑаÑÑо, пÑовеÑÑеÑÑÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº Expires, и, еÑли он еÑÑÑ, Ñо ÑÑок дейÑÑÐ²Ð¸Ñ Ð±ÐµÑÑÑÑÑ ÑавнÑм знаÑÐµÐ½Ð¸Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° Expires минÑÑ Ð·Ð½Ð°Ñение заголовка Date. ÐаконеÑ, еÑли Ð½ÐµÑ Ð½Ð¸ Ñого ни дÑÑгого, ÑмоÑÑÑÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº Last-Modified. ÐÑли он еÑÑÑ, Ñо ÑÑок дейÑÑÐ²Ð¸Ñ Ñавен знаÑÐµÐ½Ð¸Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ° Date минÑÑ Ð·Ð½Ð°Ñение заголовка Last-modified ÑазделиÑÑ Ð½Ð° 10.
ÐÑÐµÐ¼Ñ ÑÑÑаÑÐµÐ²Ð°Ð½Ð¸Ñ (expirationTime) вÑÑиÑлÑеÑÑÑ ÑледÑÑÑим обÑазом:
expirationTime = responseTime + freshnessLifetime - currentAge
где responseTime â ÑÑо вÑÐµÐ¼Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð¾ÑвеÑа по ÑаÑам бÑаÑзеÑа, а currentAge â ÑекÑÑий возÑаÑÑ ÐºÐµÑа.
Ðбновление ÑÑаÑиÑеÑÐºÐ¸Ñ ÑеÑÑÑÑов (Revved resources)
Чем болÑÑе ÑеÑÑÑÑов Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ð·ÑÑо из кеÑа, Ñем бÑÑÑÑее ÑÐ°Ð¹Ñ ÑеагиÑÑÐµÑ Ð½Ð° запÑоÑÑ Ð¸ Ñем вÑÑе его пÑоизводиÑелÑноÑÑÑ. Ðз ÑÑÐ¸Ñ ÑообÑажений Ð¸Ñ "ÑÑок годноÑÑи" Ð¸Ð¼ÐµÐµÑ ÑмÑÑл делаÑÑ ÐºÐ°Ðº можно болÑÑим. Ðднако, Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð¿Ñоблема Ñ ÑеÑÑÑÑами, коÑоÑÑе обновлÑÑÑÑÑ Ñедко и неÑегÑлÑÑно. Ðак Ñаз Ð¸Ñ ÐºÐµÑиÑование даÑÑ Ð±Ð¾Ð»ÑÑе вÑего вÑгодÑ, но ÑилÑно заÑÑÑднÑÐµÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ðµ. Такие ÑеÑÑÑÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ найÑи на лÑбой веб-ÑÑÑаниÑе: ÑÐ°Ð¹Ð»Ñ ÑкÑипÑов (JavaScript) и ÑÑилей (CSS) изменÑÑÑÑÑ Ñедко, но Ñж еÑли ÑÑо пÑоизоÑло, обновление надо пÑоизвеÑÑи как можно бÑÑÑÑее.
Ðеб-ÑазÑабоÑÑики ÑазÑабоÑали меÑод, коÑоÑÑй СÑив СандеÑÑ (Steve Sounders) назвал revving[1], ÑÑо можно пеÑевеÑÑи как "обоÑаÑиваемоÑÑÑ". ÐÐ»Ñ Ñедко обновлÑемÑÑ Ñайлов иÑполÑзÑÑÑ Ð¾ÑобÑй ÑпоÑоб именованиÑ: в Ð¸Ñ URL, обÑÑно в Ð¸Ð¼Ñ Ñайла, добавлÑÑÑ Ð½Ð¾Ð¼ÐµÑ Ñелиза или веÑÑии. Таким обÑазом, ÐºÐ°Ð¶Ð´Ð°Ñ Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑÑÐ¸Ñ ÑÑиÑаеÑÑÑ Ð¾ÑделÑнÑм ÑеÑÑÑÑом, ÑÑок ÑÑÑаÑÐµÐ²Ð°Ð½Ð¸Ñ ÐºÐ¾ÑоÑого оÑодвинÑÑ Ð´Ð°Ð»ÐµÐºÐ¾ в бÑдÑÑее, как пÑавило, на год, или болÑÑе. ÐедоÑÑаÑком ÑÑого меÑода ÑвлÑеÑÑÑ Ñо, ÑÑо Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð½Ð¾Ð²ÑÑ Ð²ÐµÑÑий ÑеÑÑÑÑа пÑÐ¸Ñ Ð¾Ð´Ð¸ÑÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð»ÑÑÑ Ð²Ñе ÑÑÑлки на него â ÑÑо некоÑоÑое ÑÑложнение, ÑпÑавиÑÑÑÑ Ñ ÐºÐ¾ÑоÑÑм ÑазÑабоÑÑÐ¸ÐºÑ Ð¿Ð¾Ð¼Ð¾Ð³Ð°ÐµÑ ÑепоÑка инÑÑÑÑменÑов. Ðбновление ÑÑаÑиÑеÑÐºÐ¸Ñ ÑеÑÑÑÑов влеÑÑÑ Ð·Ð° Ñобой обновление и ÑаÑÑо изменÑемÑÑ ÑеÑÑÑÑов. Ðогда ÑÑиÑÑваÑÑÑÑ Ð¿ÐµÑвÑе, ÑÑиÑÑваÑÑÑÑ Ð¸ новÑе веÑÑии вÑоÑÑÑ .
ÐÑÐ¾Ñ Ð¼ÐµÑод Ð¸Ð¼ÐµÐµÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑное доÑÑоинÑÑво: одновÑеменное обновление двÑÑ ÐºÐµÑиÑованнÑÑ ÑеÑÑÑÑов не пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº ÑиÑÑаÑии, пÑи коÑоÑой ÑÑÑаÑевÑÐ°Ñ Ð²ÐµÑÑÐ¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑеÑÑÑÑа иÑполÑзÑеÑÑÑ Ð²Ð¼ÐµÑÑе Ñ Ð½Ð¾Ð²Ð¾Ð¹ веÑÑией дÑÑгого. ÐÑо оÑÐµÐ½Ñ Ð²Ð°Ð¶Ð½Ð¾ Ð´Ð»Ñ ÑайÑов Ñ Ð²Ð·Ð°Ð¸Ð¼Ð¾ÑвÑзаннÑми Ñайлами ÑÑилей CSS или JS-ÑкÑипÑов â ÑвÑÐ·Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÑÑÑ, напÑимеÑ, из-за ÑÑÑлок на одни и Ñе же ÑлеменÑÑ HTML-ÑÑÑаниÑÑ.

ÐÐ¾Ð¼ÐµÑ Ð²ÐµÑÑии, добавлÑемÑй к ÑÑаÑиÑеÑÐºÐ¾Ð¼Ñ ÑеÑÑÑÑÑ, не обÑзаÑелÑно запиÑÑваÑÑ Ð² виде ÑÑандаÑÑного номеÑа веÑÑии наподобие 1.1.3, или дÑÑгого возÑаÑÑаÑÑего ÑиÑлового знаÑениÑ. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑÑо Ñгодно, позволÑÑÑее избежаÑÑ Ñовпадений â напÑимеÑ, даÑа.
ÐалидаÑÐ¸Ñ ÐºÐµÑа
ÐалидаÑÐ¸Ñ ÐºÐµÑа запÑÑкаеÑÑÑ Ð¿Ñи нажаÑии полÑзоваÑелем кнопки пеÑезагÑÑзки. ÐÑоме Ñого, она Ð¼Ð¾Ð¶ÐµÑ Ð²ÑполнÑÑÑÑÑ Ð² Ñ Ð¾Ð´Ðµ обÑÑного пÑоÑмоÑÑа ÑÑÑаниÑ, еÑли кеÑиÑованнÑй оÑÐ²ÐµÑ Ð²ÐºÐ»ÑÑÐ°ÐµÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº "Cache-control: must-revalidate". ÐÑÑгим ÑакÑоÑом ÑвлÑÑÑÑÑ Ð½Ð°ÑÑÑойки кеÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð±ÑаÑзеÑа â можно поÑÑебоваÑÑ Ð¿ÑинÑдиÑелÑной валидаÑии пÑи каждой загÑÑзке докÑменÑа.
ÐÑи иÑÑеÑении ÑÑока годноÑÑи докÑменÑа он либо пÑÐ¾Ñ Ð¾Ð´Ð¸Ñ Ð²Ð°Ð»Ð¸Ð´Ð°ÑиÑ, либо повÑоÑно доÑÑавлÑеÑÑÑ Ñ ÑеÑвеÑа. ÐалидаÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²ÑполнÑÑÑÑÑ ÑолÑко еÑли на ÑеÑвеÑе Ñеализован ÑилÑнÑй валидаÑÐ¾Ñ Ð¸Ð»Ð¸ ÑлабÑй валидаÑоÑ.
Ðаголовки ETag
Ðаголовок оÑвеÑа ETag ÑвлÑеÑÑÑ Ð½ÐµÐ¿ÑозÑаÑнÑм Ð´Ð»Ñ ÐºÐ»Ð¸ÐµÐ½ÑÑкого пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ (агенÑа) знаÑением, коÑоÑое можно иÑполÑзоваÑÑ Ð² каÑеÑÑве ÑилÑного валидаÑоÑа. СÑÑÑ Ð² Ñом, ÑÑо клиенÑ, напÑимеÑ, бÑаÑзеÑ, не знаеÑ, ÑÑо пÑедÑÑавлÑÐµÑ ÑÑа ÑÑÑока и не Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑедÑказаÑÑ, каким бÑÐ´ÐµÑ ÐµÑ Ð·Ð½Ð°Ñение. ÐÑли в оÑвеÑе пÑиÑÑÑÑÑвÑÐµÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº ETag, ÐºÐ»Ð¸ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ ÑÑанÑлиÑоваÑÑ ÐµÐ³Ð¾ знаÑение ÑеÑез заголовок If-None-Match бÑдÑÑиÑ
запÑоÑов Ð´Ð»Ñ Ð²Ð°Ð»Ð¸Ð´Ð°Ñии кеÑиÑованного ÑеÑÑÑÑа.
Ðаголовок оÑвеÑа Last-Modified можно иÑполÑзоваÑÑ Ð² каÑеÑÑве Ñлабого валидаÑоÑа. СлабÑм он ÑÑиÑаеÑÑÑ Ð¸Ð·-за Ñого, ÑÑо Ð¸Ð¼ÐµÐµÑ 1-ÑекÑндное ÑазÑеÑение. ÐÑли в оÑвеÑе пÑиÑÑÑÑÑвÑÐµÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº Last-Modified, Ñо Ð´Ð»Ñ Ð²Ð°Ð»Ð¸Ð´Ð°Ñии кеÑиÑованного докÑменÑа ÐºÐ»Ð¸ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²ÑводиÑÑ Ð² запÑоÑаÑ
заголовок If-Modified-Since.
ÐÑи запÑоÑе на валидаÑÐ¸Ñ ÑеÑÐ²ÐµÑ Ð¼Ð¾Ð¶ÐµÑ Ð»Ð¸Ð±Ð¾ пÑоигноÑиÑоваÑÑ Ð²Ð°Ð»Ð¸Ð´Ð°ÑÐ¸Ñ Ð¸ поÑлаÑÑ ÑÑандаÑÑнÑй оÑÐ²ÐµÑ 200 OK, либо веÑнÑÑÑ Ð¾ÑÐ²ÐµÑ 304 Not Modified (Ñ Ð¿ÑÑÑÑм Ñелом), Ñем ÑамÑм ÑказÑÐ²Ð°Ñ Ð±ÑаÑзеÑÑ Ð²Ð·ÑÑÑ ÐºÐ¾Ð¿Ð¸Ñ Ð¸Ð· кеÑа. РпоÑледнем ÑлÑÑае в оÑÐ²ÐµÑ Ð¼Ð¾Ð³ÑÑ Ð²Ñ
одиÑÑ Ñакже заголовки Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑока дейÑÑÐ²Ð¸Ñ ÐºÐµÑиÑованного ÑеÑÑÑÑа.
ÐзменÑÑÑиеÑÑ Ð¾ÑвеÑÑ
Ðаголовок HTTP-оÑвеÑа Vary опÑеделÑеÑ, как по заголовкам бÑдÑÑиÑ
запÑоÑов понÑÑÑ, Ð¼Ð¾Ð¶ÐµÑ Ð»Ð¸ бÑÑÑ Ð¸ÑполÑзована ÐºÐ¾Ð¿Ð¸Ñ Ð¸Ð· кеÑа, или нÑжно запÑоÑиÑÑ Ð½Ð¾Ð²Ñе даннÑе Ñ ÑеÑвеÑа.
ÐÑли ÐºÐµÑ Ð¿Ð¾Ð»ÑÑÐ°ÐµÑ Ð·Ð°Ð¿ÑоÑ, коÑоÑÑй можно ÑдовлеÑвоÑиÑÑ ÑоÑ
ÑанÑннÑм в кеÑе оÑвеÑом Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¾Ð¼ Vary, Ñо иÑполÑзоваÑÑ ÑÑÐ¾Ñ Ð¾ÑÐ²ÐµÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑолÑко пÑи Ñовпадении вÑеÑ
ÑказаннÑÑ
в Vary полей заголовка иÑÑ
одного (ÑоÑ
ÑанÑнного в кеÑе) запÑоÑа и нового запÑоÑа.

ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾, напÑимеÑ, пÑи динамиÑеÑком пÑедоÑÑавлении конÑенÑа. ÐÑи иÑполÑзовании заголовка Vary: User-Agent кеÑиÑÑÑÑие ÑеÑвеÑа, пÑÐ¸Ð½Ð¸Ð¼Ð°Ñ ÑеÑение об иÑполÑзовании ÑÑÑаниÑÑ Ð¸Ð· кеÑа, Ð´Ð¾Ð»Ð¶Ð½Ñ ÑÑиÑÑваÑÑ Ð°Ð³ÐµÐ½Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ. Так можно избежаÑÑ ÑиÑÑаÑии, когда полÑзоваÑели мобилÑнÑÑ
ÑÑÑÑойÑÑв по оÑибке полÑÑÐ°Ñ Ð´ÐµÑкÑопнÑÑ Ð²ÐµÑÑÐ¸Ñ Ð²Ð°Ñего ÑайÑа. Ðдобавок, ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð¼Ð¾ÑÑ Google и дÑÑгим поиÑковÑм ÑиÑÑемам обнаÑÑжиÑÑ Ð¼Ð¾Ð±Ð¸Ð»ÑнÑÑ Ð²ÐµÑÑÐ¸Ñ ÑÑÑаниÑÑ, и Ð¼Ð¾Ð¶ÐµÑ Ñакже ÑказаÑÑ Ð¸Ð¼ на Ñо, ÑÑо здеÑÑ Ð½ÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¾Ð¹ Ð¿Ð¾Ð´Ð¼ÐµÐ½Ñ ÐºÐ¾Ð½ÑенÑа Ñ ÑелÑÑ Ð¿Ð¾Ð¸Ñковой опÑимизаÑии (Cloaking).
Vary: User-Agent
ÐоÑколÑÐºÑ Ð·Ð½Ð°Ñение заголовка User-Agent ÑазлиÑаеÑÑÑ ("varies") Ñ Ð¼Ð¾Ð±Ð¸Ð»ÑнÑÑ
и деÑкÑопнÑÑ
клиенÑов, закеÑиÑованнÑй мобилÑнÑй конÑÐµÐ½Ñ Ð½Ðµ бÑÐ´ÐµÑ Ð¿Ð¾ оÑибке оÑÑÑлаÑÑÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑм деÑкÑопов и наобоÑоÑ.
СмоÑÑиÑе Ñакже
- RFC 7234: Hypertext Transfer Protocol (HTTP/1.1): Caching
- Caching Tutorial â Mark Nottingham
- HTTP caching â Ilya Grigorik
- RedBot, инÑÑÑÑÐ¼ÐµÐ½Ñ Ð´Ð»Ñ Ð¿ÑовеÑки оÑноÑÑÑÐ¸Ñ ÑÑ Ðº кеÑÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¾Ð² HTTP .