Cache-Control — шта је то, директиве и управљање кеширањем

Аутор: IT Sectr Објављено: 2026-03-09 Време читања: 9 мин

Cache-Control — је HTTP заглавље који одређује правила кеширања ресурса на страни клијента, прокси сервера и CDN-а помоћу скупа директива. За разлику од застарелог заглавља Expires, Cache-Control подржава десетине комбинација: max-age поставља време живота у секундама, private и public управљају доступношћу кеша, no-cache и no-store — принудно проверавање. Према Google Web Dev (2025), правилна конфигурација Cache-Control може скратити време учитавања страница за 50-80% за поновне посете. То чини заглавље критичним за перформансе веб и мобилних апликација.

Главно

  • Cache-Control — HTTP заглавље са директивама којима управља кеширањем на клијенту, проксију и CDN-у
  • max-age — кључна директива која поставља време живота ресурса у секундама без поновне провере
  • private vs public — private дозвољава кеш само на клијенту, public — такође на проксију и CDN-у
  • no-cache vs no-store — no-cache захтева проверу пре употребе, no-store забрањује кеш у потпуности
  • s-maxage — замењује max-age за заједничке (shared) кешеве, не утичући на прегледаче

Шта је Cache-Control?

Cache-Control — је HTTP заглавље, стандардизовано у HTTP/1.1 (RFC 7234), које омогућује серверу да наведе како и колико времена клијенти, проксији и CDN-ови могу да кеширају одговор. За разлику од Expires (HTTP/1.0), Cache-Control користи директиве — текстуалне наредбе које се комбинују зарезом: Cache-Control: public, max-age=3600, must-revalidate. Заглавље пружа прецизну контролу над сваким звезном ланца кеширања.

Кеширање је један од основних механизама перформанси веба и мобилних апликација. Без њега, сваки захтев корисника ишао би директно до сервера, изазивајући прекомерно оптерећење и кашњење. Cache-Control одређује три нивоа кеширања: прегледач/апликација (private cache), прокси сервери (shared cache) и CDN (distributed cache). Сваки ниво тумачи директиве на свој начин.

Неправилно подешавање Cache-Control-а је једна од најчешћих причина проблема са перформансом. Превише агресивно кеширање доводи до тога да корисници виде застареле податке. Превише слабо кеширање доводи до прекомерних захтева ка серверу и спорог учитавања. Према Akamai (2025), оптимизација Cache-Control-а за статички садржај смањује оптерећење сервера за 70-90% и побољшава време учитавања за 40-60% за мобилне кориснике.

Историја заглавља

Cache-Control се појавио у HTTP/1.1 (RFC 2616, 1999) као замена за Expires. Expires је имао фундаментални проблем: користио је апсолутни датум који је зависио од временске зоне сервера и клијента. Cache-Control је решио овај проблем преласком на релативно време (max-age у секундама од тренутка пријема одговора). Касније су у RFC 7234 (2014) додате нове директиве: immutable за статику, stale-while-revalidate и stale-if-error за одложену проверу.

Директиве Cache-Control-а

Cache-Control укључује преко 10 директива подељених у три групе: директиве захтева (клијент → сервер), директиве одговора (сервер → клијент) и проширења. У пракси, у мобилном развоју користи се 6-7 основних директива одговора које покривају 95% сценарија кеширања. Размотримо сваку са примерима и препорукама.

ДирективаЗначењеПример
max-ageВреме живота у секундама од тренутка одговораmax-age=3600 — 1 сат
s-maxagemax-age за shared cache (прокси, CDN)s-maxage=86400 — 1 дан за CDN
publicДозвољава кеширање свима (укључујући прокси)public, max-age=3600
privateДозвољава кеш само прегледачу/апликацијиprivate, max-age=600
no-cacheНе користити без провере (304 обавезан)no-cache
no-storeПотпуна забрана кеширањаno-store
must-revalidateНакон max-age обавезно проверити код origin-аmax-age=3600, must-revalidate
immutableРесурс се неће промењити (за верзионисану статику)max-age=31536000, immutable

max-age — најважнија директива. Забрањује клијенту да шаље захтев ка серверу у одређеном временском периоду. За статику (CSS, JS, слике) max-age се обично поставља од 1 дана до 1 године. За API одговоре — од 0 секунди (подаци увек свежи) до 5-10 минута (референтни подаци). s-maxage омогућује постављање различитог времена живота за CDN и прегледач: CDN чува копију 1 дан, прегледач — 1 сат.

no-cache vs no-store

Ове двије директиве се често мешају. no-cache не забрањује кеширање — захтева проверу кеширане копије при свакој употреби кроз условни захтев (If-Modified-Since или If-None-Match). Ако сервер одговори 304 — клијент користи кеш. Ако 200 — ажурира. no-store потпуно забрањује чување одговора у било којем кешу, укључујући дисковни и радни. Користите no-store само за осетљиве податке — токене, податке о плаћању, личне документе.

Cache-Control vs Expires

Заглавље Expires (HTTP/1.0) такође одређује време живота ресурса, али користи апсолутни датум: Expires: Thu, 03 Jul 2026 12:00:00 GMT. Cache-Control max-age — релативно време од тренутка одговора. Разлика је критична за расподијељене системе: ако су сервер и клијент у различитим временским зонама, Expires може бити погрешно протумачен. Cache-Control нема овај проблем — 3600 секунди је увек 3600 секунди.

Када су оба заглавља присутна, Cache-Control има приоритет над Expires. Ово је дефинисано у RFC 7234: „Ако одговор садржи Cache-Control са директивом max-age, прималац МОРА да игнорише Expires”. У пракси се препоручује да се Expires не враћа за модерне клијенте, јер Cache-Control покрива све сценарије Expires. Међутим, за уназад компатибилност са старим проксијима и прегледачима могу се враћати оба заглавља.

Expires је остао углавном за статички садржај на Nginx и Apache — ови сервери аутоматски додају оба заглавља. Ако се у вашем пројекту појављује Expires без Cache-Control-а, замењите га Cache-Control-ом са max-age: прецизност управљања кешом расте, а зависност од временске зоне се елиминише. За миграцију довољно је конфигурисати сервер да додаје Cache-Control уместо Expires.

nginx
# Nginx: Cache-Control за статичке датотеке
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 30d;
    add_header Cache-Control "public, immutable, max-age=2592000";
}

# Различите политике за различите типове садржаја
location /api/config {
    expires -1;
    add_header Cache-Control "no-cache, must-revalidate";
}

location /api/static-data {
    expires 5m;
    add_header Cache-Control "public, max-age=300";
}

У Nginx конфигурацији за статичке датотеке (CSS, JS, слике) поставља се Cache-Control на 30 дана са immutable атрибутом — овај атрибут обавештава прегледач да се ресурс никада не мења под овим URL-ом (верзионисање путем хеша у називу датотеке). API ендпојнти за динамичке податке користе no-cache, а за референтне — public са кратким max-age: често тражене листе које се ретко мењају.

Кеширање у мобилним апликацијама

У мобилним апликацијама Cache-Control игра посебну улогу због ограничења мобилних мрежа: висока кашњење, нестабилна веза, ограничења протока. Правилно кеширање омогућује кориснику да види податке тренутно, чак и офлајн, и да их ажурира у позадини. OkHttp на Android-у и URLSession на iOS-у имају уграђене системе кеширања који уважавају Cache-Control.

OkHttp користи CacheInterceptor, који чита Cache-Control из одговора и аутоматски управља кеширањем. Ако сервер врати Cache-Control: max-age=3600, OkHttp неће слати захтев серверу сат времена. Након истека max-age, OkHttp шаље условни захтев са If-Modified-Since и If-None-Match. Подешавање кеша у OkHttp: OkHttpClient.Builder().cache(Cache(directory, maxSize)).

kotlin
fun createCachedClient(cacheDir: File): OkHttpClient {
    return OkHttpClient.Builder()
        .cache(Cache(cacheDir, 10L * 1024 * 1024))
        .addNetworkInterceptor { chain ->
            val response = chain.proceed(chain.request())
            response.newBuilder()
                .header("Cache-Control",
                    "public, max-age=300")
                .removeHeader("Pragma")
                .build()
        }
        .build()
}

Код креира OkHttpClient са кешом од 10 MB и прегаза Cache-Control кроз NetworkInterceptor. Ако сервер не враћа Cache-Control или користи Expires, интерцептор додаје public, max-age=300 (5 минута). Интерцептор уклања застарело заглавље Pragma (HTTP/1.0) ради компатибилности. По истом обрасцу ради кеширање на iOS-у путем URLCache.shared са конфигурацијом memoryCapacity и diskCapacity.

Офлајн мод и stale-while-revalidate

Директива stale-while-revalidate омогућује кориснику да види застарели кеш (stale) док апликација у позадини учитава свеже податке. Ово даје ефекат тренутног одговора: корисник види садржај одмах, а након секунде он се ажурира. Подржан у OkHttp од верзије 3.10 и URLCache на iOS 14+. Пример: Cache-Control: max-age=3600, stale-while-revalidate=300 — 1 сат актуелног кеша, затим 5 минута приказа застарелог кеша са ажурирањем у позадини.

Примери подешавања Cache-Control-а

Различити типови ресурса захтевају различите стратегије кеширања. Размотримо оптималне конфигурације за типичне сценарије у мобилном развоју. За статички садржај са хешом у називу датотеке (bundle.abc123.js) може се поставити max-age до 1 године са immutable. За API листе које се ретко ажурирају (каталози, категорије) — max-age од 5 минута до 1 сата са stale-while-revalidate.

Тип ресурсаCache-ControlОбјашњење
Верзионисана статикаpublic, max-age=31536000, immutable1 година, датотеке се не мењају (хеш у URL)
Неверзионисана статикаpublic, max-age=86400, must-revalidate1 дан са обавезном провером након
API: референтни подациpublic, max-age=600, stale-while-revalidate=6010 минута кеша + 1 минут stale
API: кориснички подациprivate, max-age=601 минут, само за одређеног корисника
API: осетљиви подациno-storeПотпуна забрана кеширања
HTML страницеno-cache, must-revalidateПровера при сваком захтеву, 304 при непромењењу

Важно запамтити сигурност: за одговоре који садрже личне податке корисника увек постављајте private. Без ове директиве, јавни прокси (нпр. корпоративни) може да кешира одговор и преда га другом кориснику. За аутентификационе токене и информације о плаћању користите no-store — чак ни private кеш не треба да чува ове податке на диску.

Отклањање кеширања

За проверу исправности Cache-Control-а користите заглавље Age (колико секунди се кеш чува) и X-Cache (hit/miss на CDN). У прегледачу — картица Network, колона Size приказује „from disk cache” или „304 Not Modified”. Ако би ресурс требало да се кешира, али се учитава сваки пут — проверите да ли сервер не додаје Cache-Control: no-cache или Pragma: no-cache заједно са вашим директивама.

Често постављана питања

Која је разлика између max-age и s-maxage?

max-age дејствује за све кешеве (укључујући прегледаче), s-maxage — само за shared cache (прокси, CDN). Ако је наведен s-maxage, CDN игнорише max-age и користи s-maxage. Ово омогућује постављање различитог времена живота за прегледач и CDN.

Може ли се поништити кеширање након слања Cache-Control-а?

Не, након слања одговора са max-age, клијент неће слати захтев до истека тајмера. За тренутно поништење кеша потребно је променити URL ресурса (додати верзију/хеш) и послати push обавештења или WebSocket поруке за принудно поништење.

Шта је immutable директива?

Директива immutable (RFC 8246) обавештава прегледач да се ресурс никада неће променити под овим URL-ом. Прегледач чак ни не покушава да пошаље условни захтев при освежавању странице — користи кеш до истека max-age. Ради само са верзионисаним датотекама.

Како Cache-Control утиче на SEO?

Googlebot уважава Cache-Control: дуго кеширање убрзава поновно скенирање. noindex са брзим кешом — ок. no-store може успорити индексирање, јер Googlebot учитава страницу сваки пут из почетка. Превише кратак max-age повећава оптерећење сервера приликом скенирања.

Како подесити Cache-Control у Express.js-у?

Путем helmet или middleware: res.set('Cache-Control', 'public, max-age=3600'). За статику користите express.static са параметром maxAge: express.static('public', {maxAge: '1y'}). За динамичке руте — појединачно у сваком handler-у.

Резиме

  • Cache-Control — главни HTTP заглавље за управљање кеширањем са флексибилним системом директива
  • max-age — време живота у секундама од тренутка одговора; кључна директива за све сценарије кеширања
  • private vs public — private само за клијента, public за прокси и CDN; утиче на сигурност података
  • no-cache захтева проверу, no-store потпуно забрањује кеш; различите намене, не мијешати
  • s-maxage — замењује max-age за shared cache, кориснан за раздвајање политика прегледач/CDN
  • stale-while-revalidate — приказ застарелог кеша са ажурирањем у позадини за тренутни UX
  • Препорука — подесите Cache-Control за сваки тип ресурса на серверу и у HTTP клијенту мобилне апликације

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође