Cache-Control — bu nədir, direktivlər və keş idarəetməsi

Müəllif: IT Sectr Dərc olunub: 2026-03-09 Oxuma vaxtı: 9 dəq

Cache-Control — HTTP başlığıdır, direktivlər dəsti vasitəsilə müşteri tərəfində, proksi-serverlərdə və CDN-də resursların keşlənmə qaydalarını müəyyənləşdirir. Köhnəlmiş Expires başlığından fərqli olaraq, Cache-Control onlarla kombinasiyanı dəstəkləyir: max-age saniyələrlə ömür müddətini təyin edir, private və public keşin əlçatanlığını idarə edir, no-cache və no-store məcburi yoxlama aparır. Google Web Dev (2025) məlumatlarına görə, Cache-Control-un düzgün konfiqurasiyası təkrari ziyarətlərdə səhifə yükləmə müddətini 50-80% azalda bilər. Bu, başlığı veb və mobil tətbiqlərin performansı üçün kritik edir.

Vacib olanlar

  • Cache-Control — müşteri, proksi və CDN-də keşlənməni idarə edən direktivlərlə HTTP başlığı
  • max-age — resursun təkrari yoxlama olmadan saniyələrlə ömür müddətini təyin edən əsas direktiv
  • private vs public — private yalnız müşteridə keşə icazə verir, public həmçinin proksi və CDN-də
  • no-cache vs no-store — no-cache istifadədən əvvəl yoxlama tələb edir, no-store keşi tamamilə qadağan edir
  • s-maxage — brauzerlərə təsir etmədən, ümumi (shared) keşlər üçün max-age-i ləğv edir

Cache-Control nədir?

Cache-Control — HTTP/1.1 (RFC 7234) çərçivəsində standartlaşdırılmış HTTP başlığıdır, serverə müşterilərin, proksilərin və CDN-lərin cavabı necə və nə qədər keşləyə biləcəyini göstərməyə imkan verir. Expires-dən (HTTP/1.0) fərqli olaraq, Cache-Control direktivlərdən — vergüllə birləşdirilən mətn əmrlərindən istifadə edir: Cache-Control: public, max-age=3600, must-revalidate. Başlıq keşlənmə zəncirinin hər bir halqası üzərində dəqiq nəzarət verir.

Keşlənmə veb və mobil tətbiqlərin performansının əsas mexanizmlərindən biridir. O olmadan, hər bir istifadəçi sorğusu birbaşa serverə gedərək həddindən artıq yük və gecikmələrə səbəb olardı. Cache-Control üç keşlənmə səviyyəsini müəyyənləşdirir: brauzer/tətbiq (private cache), proksi-serverlər (shared cache) və CDN (distributed cache). Hər səviyyə direktivləri özünə məxsus şəkildə şərh edir.

Cache-Control-un səhv qurulması performans problemlərinin ən geniş yayılmış səbəblərindən biridir. Həddindən artıq aqressiv keşlənmə istifadəçilərin köhnəlmiş məlumatları görməsinə səbəb olur. Çox zəif keşlənmə isə serverə həddindən artıq sorğu və yavaş yükləməyə gətirir. Akamai (2025) məlumatlarına görə, statik məzmun üçün Cache-Control optimallaşdırılması server yükünü 70-90% azaldır və mobil istifadəçilər üçün yükləmə müddətini 40-60% yaxşılaşdırır.

Başlığın tarixi

Cache-Control HTTP/1.1 (RFC 2616, 1999) çərçivəsində Expires-in əvəzi kimi ortaya çıxdı. Expires əsas problemə malik idi: server və müşterinin saat qurşağından asılı olan mütləq tarixdən istifadə edirdi. Cache-Control bu problemi nisbi vaxta keçməklə həll etdi (cavabın alınması anından saniyələrlə max-age). Daha sonra RFC 7234 (2014) əlavə olaraq yeni direktivlər əlavə edildi: statik üçün immutable, təxirə salınmış yoxlama üçün stale-while-revalidate və stale-if-error.

Cache-Control direktivləri

Cache-Control üç qrupa bölünmüş 10-dan çox direktivi əhatə edir: sorğu direktivləri (müşteri → server), cavab direktivləri (server → müşteri) və genişləndirmələr. Təcrübədə mobil inkişafda keşlənmə ssenarilərinin 95%-ni əhatə edən 6-7 əsas cavab direktivindən istifadə olunur. Hər birini nümunələr və tövsiyələrlə nəzərdən keçirək.

DirektivMənasıNümunə
max-ageCavab anından saniyələrlə ömür müddətimax-age=3600 — 1 saat
s-maxageShared cache üçün max-age (proksi, CDN)s-maxage=86400 — CDN üçün 1 gün
publicHər kəsə keşlənməyə icazə verir (proksi daxil)public, max-age=3600
privateYalnız brauzerə/tətbiqə keşə icazə verirprivate, max-age=600
no-cacheYoxlama olmadan istifadə etməyin (304 məcburi)no-cache
no-storeKeşlənmənin tam qadağan edilməsino-store
must-revalidateMax-age bitdikdən sonra origin-dən yoxlama məcburimax-age=3600, must-revalidate
immutableResurs dəyişməyəcək (versiyalanmış statik üçün)max-age=31536000, immutable

max-age — ən vacib direktiv. Müəyyən edilmiş müddət ərzində müşteriyə serverə sorğu göndərməyi qadağan edir. Statik üçün (CSS, JS, şəkillər) max-age adətən 1 gündən 1 ilə qədər qurulur. API cavabları üçün — 0 saniyədən (həmişə təzə məlumatlar) 5-10 dəqiqəyə qədər (istinad məlumatları). s-maxage CDN və brauzer üçün fərqli ömür müddəti təyin etməyə imkan verir: CDN 1 gün, brauzer 1 saat saxlayır.

no-cache vs no-store

Bu iki direktiv çox vaxt qarışdırılır. no-cache keşlənməni qadağan etmir — o, hər istifadədə şərti sorğu vasitəsilə (If-Modified-Since və ya If-None-Match) keşlənmiş nüsxənin yoxlanmasını tələb edir. Server 304 cavabı verərsə — müşteri keşdən istifadə edir. 200 verərsə — yeniləyir. no-store isə cavabın hər hansı keşdə (disk və operativ daxil olmaqla) saxlanmasını tamamilə qadağan edir. no-store-dan yalnız həssas məlumatlar üçün istifadə edin — tokenlər, ödəniş məlumatları, şəxsi sənədlər.

Cache-Control vs Expires

Expires başlığı (HTTP/1.0) da resursun ömür müddətini göstərir, lakin mütləq tarixdən istifadə edir: Expires: Thu, 03 Jul 2026 12:00:00 GMT. Cache-Control max-age — cavab anından nisbi vaxtdır. Fərq paylanmış sistemlər üçün kritikdir: server və müşteri müxtəlif saat qurşaqlarındadırsa, Expires səhv şərh edilə bilər. Cache-Control-un bu problemi yoxdur — 3600 saniyə həmişə 3600 saniyədir.

Hər iki başlıq mövcud olduqda, Cache-Control Expires-dən üstünlükə malikdir. Bu, RFC 7234-də müəyyən edilmişdir: “Cavabda max-age direktivi ilə Cache-Control varsa, alıcı Expires-i NİZAMMALIDIR”. Təcrübədə müasir müşterilər üçün Expires-in qaytarılmaması tövsiyə olunur, çünki Cache-Control Expires-in bütün ssenarilərini əhatə edir. Lakin köhnə proksi və brauzerlərlə geriyə uyğunluq üçün hər iki başlıq qaytarıla bilər.

Expires əsasən Nginx və Apache-də statik məzmun üçün qalıb — bu serverlər avtomatik olaraq hər iki başlığı əlavə edir. Layihənizdə Expires Cache-Control olmadan rast gəlirsə, onu max-age ilə Cache-Control ilə əvəz edin: keş idarəetməsinin dəqiqliyi artır və saat qurşağından asılılıq aradan qaldırılır. Miqrasiya üçün serveri Expires əvəzinə Cache-Control əlavə etmək üçün konfiqurasiya etmək kifayətdir.

nginx
# Nginx: Statik fayllar üçün Cache-Control
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 30d;
    add_header Cache-Control "public, immutable, max-age=2592000";
}

# Müxtəlif məzmun növləri üçün fərqli siyasətlər
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 konfiqurasiyasında statik fayllar üçün (CSS, JS, şəkillər) immutable atributu ilə 30 günlük Cache-Control qurulur — bu atribut brauzerə resursun bu URL altında heç vaxt dəyişmədiyini bildirir (fayl adında hash vasitəsilə versiyalama). API endpointləri dinamik məlumatlar üçün no-cache, istinad məlumatları üçün isə qısa max-age ilə public istifadə edir — tez-tez tələb olunan və nadir dəyişən siyahılar.

Mobil tətbiqlərdə keşlənmə

Mobil tətbiqlərdə Cache-Control xüsusi rol oynayır, çünki mobil şəbəkələrin məhdudiyyətləri var: yüksək gecikmə, qeyri-sabit əlaqə, trafik məhdudiyyətləri. Düzgün keşlənmə istifadəçiyə məlumatları dərhal, hətta oflayn göstərməyə və onları fonda yeniləməyə imkan verir. Android-də OkHttp və iOS-da URLSession Cache-Control-u nəzərə alan daxili keşlənmə sistemlərinə malikdir.

OkHttp cavabdan Cache-Control-u oxuyan və avtomatik keşlənməni idarə edən CacheInterceptor-dan istifadə edir. Server Cache-Control: max-age=3600 qaytararsa, OkHttp bir saat ərzində serverə sorğu göndərməyəcək. Max-age bitdikdən sonra OkHttp If-Modified-Since və If-None-Match ilə şərti sorğu göndərir. OkHttp-də keşin qurulması: 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()
}

Kod 10 MB keşlə OkHttpClient yaradır və NetworkInterceptor vasitəsilə Cache-Control-u ləğv edir. Server Cache-Control qaytarmazsa və ya Expires istifadə edərsə, interceptor public, max-age=300 (5 dəqiqə) əlavə edir. Interceptor uyğunluq üçün köhnəlmiş Pragma başlığını (HTTP/1.0) silir. Eyni sxem üzrə iOS-da URLCache.shared vasitəsilə memoryCapacity və diskCapacity parametrləri ilə keşlənmə işləyir.

Oflayn rejim və stale-while-revalidate

stale-while-revalidate direktivi tətbiq fonda təzə məlumatları yükləyərkən istifadəçiyə köhnəlmiş keşi (stale) göstərməyə imkan verir. Bu, ani cavab effekti yaradır: istifadəçi məzmunu dərhal görür və bir saniyə sonra yenilənmiş versiyanı alır. OkHttp 3.10 və iOS 14+ URLCache tərəfindən dəstəklənir. Nümunə: Cache-Control: max-age=3600, stale-while-revalidate=300 — 1 saat aktual keş, sonra fonda yenilənmə ilə 5 dəqiqə köhnəlmiş məlumatların göstərilməsi.

Cache-Control qurulması nümunələri

Müxtəlif resurs növləri müxtəlif keşlənmə strategiyaları tələb edir. Mobil inkişafda tipik ssenarilər üçün optimal konfiqurasiyaları nəzərdən keçirək. Fayl adında hash olan statik məzmun üçün (bundle.abc123.js) immutable ilə 1 ilə qədər max-age təyin etmək olar. Nadir yenilənən API siyahıları üçün (kataloqlar, kateqoriyalar) — stale-while-revalidate ilə 5 dəqiqədən 1 saata qədər max-age.

Resurs növüCache-Controlİzah
Versiyalanmış statikpublic, max-age=31536000, immutable1 il, fayllar dəyişmir (URL-də hash)
Versiyalanmamış statikpublic, max-age=86400, must-revalidate1 gün, sonra məcburi yoxlama
API: istinad məlumatlarıpublic, max-age=600, stale-while-revalidate=6010 dəqiqə keş + 1 dəqiqə stale
API: istifadəçi məlumatlarıprivate, max-age=601 dəqiqə, yalnız müəyyən istifadəçi üçün
API: həssas məlumatlarno-storeKeşlənmənin tam qadağan edilməsi
HTML səhifələrino-cache, must-revalidateHər sorğuda yoxlama, dəyişməzsə 304

Təhlükəsizlik haqqında xatırlamaq vacibdir: istifadəçinin şəxsi məlumatlarını ehtiva edən cavablar üçün həmişə private təyin edin. Bu direktiv olmadan, ümumi proksi (məs. korporativ) cavabı keşləyib başqa istifadəçiyə ötürə bilər. Autentifikasiya tokenləri və ödəniş məlumatları üçün no-store istifadə edin — hətta private keş də bu məlumatları diskdə saxlamamalıdır.

Keşlənmənin sazlanması

Cache-Control-un düzgünlüyünü yoxlamaq üçün Age başlığından (keşin neçə saniyə saxlanıldığı) və X-Cache-dən (hit/miss CDN-də) istifadə edin. Brauzerdə — Network sekmesi, Size sütunu “from disk cache” və ya “304 Not Modified” göstərir. Resurs keşlənməli, lakin hər dəfə yüklənirsə — serverin direktivlərinizlə birlikdə Cache-Control: no-cache və ya Pragma: no-cache əlavə edib-etmədiyini yoxlayın.

Tez-tez verilən suallar

Max-age və s-maxage arasındakı fərq nədir?

max-age bütün keşlər (brauzerlər daxil olmaqla) üçün işləyir, s-maxage yalnız shared cache (proksi, CDN) üçündür. s-maxage göstərilərsə, CDN max-age-i nəzərdən qaçırır və s-maxage-dən istifadə edir. Bu, brauzer və CDN üçün fərqli ömür müddəti təyin etməyə imkan verir.

Cache-Control göndərildikdən sonra keşlənməni ləğv etmək olarmı?

Xeyr, max-age ilə cavab göndərildikdən sonra müşteri timer bitənə qədər sorğu göndərməyəcək. Keşin dərhal ləğvi üçün resursun URL-ni dəyişdirmək (versiya/hash əlavə etmək) və məcburi sıfırlama üçün push bildirişləri və ya WebSocket mesajları göndərmək lazımdır.

Immutable direktivi nədir?

Immutable direktivi (RFC 8246) brauzerə resursun bu URL altında heç vaxt dəyişməyəcəyini bildirir. Brauzer səhifəni yeniləyərkən şərti sorğu göndərməyə belə çalışmır — max-age bitənə qədər keşdən istifadə edir. Yalnız versiyalanmış fayllarla işləyir.

Cache-Control SEO-ya necə təsir edir?

Googlebot Cache-Control-u nəzərə alır: uzun keşlənmə təkrari skanlaşmanı sürətləndirir. Sürətli keşlə noindex — yaxşıdır. no-store indeksləməni yavaşâda bilər, çünki Googlebot səhifəni hər dəfə sıfırdan yükləyəcək. Çox qısa max-age skanlaşma zamanı server yükünü artırır.

Express.js-də Cache-Control-u necə qurmaq olar?

Helmet və ya middleware vasitəsilə: res.set('Cache-Control', 'public, max-age=3600'). Statik üçün maxAge parametri ilə express.static istifadə edin: express.static('public', {maxAge: '1y'}). Dinamik marşrutlar üçün — hər handlerdə fərdi qaydada.

Nəticələr

  • Cache-Control — çevik direktiv sistemi ilə keşlənməni idarə edən əsas HTTP başlığı
  • max-age — cavab anından saniyələrlə ömür müddəti; bütün keşlənmə ssenariləri üçün əsas direktiv
  • private vs public — private yalnız müşteri üçün, public proksi və CDN üçün; məlumat təhlükəsizliyinə təsir edir
  • no-cache yoxlama tələb edir, no-store keşi tamamilə qadağan edir; fərqli məqsədlər, qarışdırmayın
  • s-maxage — shared cache üçün max-age-i ləğv edir, brauzer/CDN siyasətlərinin ayrılması üçün faydalıdır
  • stale-while-revalidate — ani UX üçün fonda yenilənmə ilə köhnəlmiş keşin göstərilməsi
  • Tövsiyə — serverdə və mobil HTTP müşterisində hər resurs növü üçün Cache-Control qurun

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun