Last-Modified — serverdəki resursun son dəyişdirilmə tarixini və vaxtını göstərən HTTP cavab başlığıdır və müştəriyə If-Modified-Since vasitəsilə şərti sorğular yerinə yetirməyə imkan verir. Resurs göstərilən tarixdən etibarən dəyişməyibsə, server cavab gövdəsini ötürmədən 304 Not Modified qaytarır ki, bu da trafikə əhəmiyyətli dərəcədə qənaət edir. RFC 7232 (IETF, 2014)-yə görə, Last-Modified ilə şərti sorğular təkrar ziyarətlərdə səhifələrin yüklənmə müddətini 30–60% azaldır. Başlıq əksər HTTP serverləri və proksilər tərəfindən avtomatik dəstəklənir.
Başlıca məqamlar
Last-Modified — şərti sorğular (conditional requests) başlıqlar qrupuna daxil olan HTTP başlığıdır. Server onu GET və ya HEAD cavabına əlavə edərək tələb olunan resursun son dəyişdirilmə tarixini və vaxtını HTTP-date formatında göstərir: Last-Modified: Wed, 02 Jul 2025 14:30:00 GMT. Müştəri (brauzer, mobil tətbiq, proksi) bu tarixi keşlənmiş resursla birlikdə saxlayır. Təkrar sorğuda müştəri eyni tarixlə If-Modified-Since başlığını göndərir və server onu resursun cari dəyişiklik vaxtı ilə müqayisə edir.
Last-Modified ilə şərti sorğu protokolu RFC 7232-də müəyyən edilmişdir və bütün müasir HTTP serverləri tərəfindən dəstəklənir. Tarix formatı ciddi şəkildə tənzimlənir — yalnız GMT (Greenwich Mean Time) saat qurşağı göstərilmədən. Server tüç mümkün formatda tarix qaytara bilər: RFC 1123 (standart), RFC 850 (köhnəlmiş) və ya ANSI C asctime. Praktikada demək olar ki, bütün serverlər 29 simvol sabit uzunluğunda RFC 1123 formatından istifadə edir.
Last-Modified keşləmənin valideyasiya mexanizmləri kateqoriyasına aiddir: o, müştəriyə cavabı keşləməyin mümkün olub-olmadığını demir, əksinə, artıq keşlənmiş resursun aktual olub-olmadığını yoxlamaq üçün alət verir. Keşləmə siyasəti Cache-Control başlığı vasitƏsilə ayrıca müəyyən edilir. Akamai (2025) tədqiqatına görə, Last-Modified-in Cache-Control ilə birlikdə düzgün konfiqurasiyası statik məzmun üçün origin serverlərə yükü 70%-ə qədər azaldır.
Last-Modified başlığı hələ HTTP/1.0-da (RFC 1945, 1996) müəyyən edilmişdir və vebdə keşləməni idarə etməyin ilk mexanizmlərindən biri olmuşdur. ETag HTTP/1.1-də meydana çıxana qədər şərti sorğuların yeganə yolu idi. Yaşına baxmayaraq, başlıq sadəliyi sayəsində aktual olaraq qalır — server məzmunun heşini hesablamalı deyil, sadəcə fayl sistemindən faylın timestamp-ini və ya verilənlər bazasından updated_at sahəsini oxumaq kifayətdir.
Tam dövriyyü üç mərhələni əhatə edir. İlk sorğuda server resursu Last-Modified başlığı və 200 OK HTTP statusu ilə qaytarır. Müştəri cavabı tarixlə birlikdə keşləyir. Təkrar sorğuda müştəri saxlanılan tarixlə If-Modified-Since başlığını göndərir. Server bu tarixi resursun cari dəyişiklik vaxtı ilə müqayisə edir. Resurs dəyişməyibsə — boş gövdƏlə 304 Not Modified qaytarılır. Dəyişmişsə — yeni məlumatlar və yeni Last-Modified ilə 200 OK qaytarılır.
// İlk sorğu — server resursu tarixlə qaytarır
HTTP/1.1 200 OK
Content-Type: application/json
Last-Modified: Wed, 02 Jul 2025 14:30:00 GMT
[{"id": 1, "name": "Alice"}]
// Təkrar sorğu — müştəri saxlanılan tarixi göndərir
GET /api/users HTTP/1.1
Host: example.com
If-Modified-Since: Wed, 02 Jul 2025 14:30:00 GMT
// Cavab — məlumatlar dəyişməyib
HTTP/1.1 304 Not Modified
Mobil tətbiqlər üçün Last-Modified məlumat sinxronizasiyası zamanı xüsusilə faydalıdır. Tətbiq son uğurlu yeniləmənin tarixini saxlayır və onu serverə If-Modified-Since-də göndərir. Daha çox məlumat varsa və ya dəyişmişsə — server tam dəsti qaytarır. Yoxsa — 304, və tətbiq yerli surətdən istifadə edir. OkHttp və URLSession bu mexanizmi daxili keşləmə sistemləri vasitƏ silə avtomatik dəstəkləyir.
Statik fayllar üçün Nginx və Apache tarixi fayl sisteminin atributlarından — mtime (dəyişiklik vaxtı) götürür. Dinamik məzmun üçün server kodu biznes məntiqinə əsasən Last-Modified-i açıq şəkildə təyin etməlidir: verilənlər bazasındakı updated_at sahəsi, Git-dəki son commit tarixi, artefaktın qurulma timestamp-i. Last-Modified açıq təyin edilməyibsə, server ümumiyyətlə başlığı qaytarmaya bilər və müştəri tarixə görə şərti sorğular yerinə yetirə bilməz.
Last-Modified və ETag oxşar tapşırığı yerinə yetirir — müştəriyə keşin aktual olub-olmadığını yoxlamağa imkan verir — lakin prinsipial fərqlərə malikdir. Last-Modified vaxt damğasından istifadə edir, ETag isə unikal versiya identifikatorundan. Hər yanaşmanın özünün daha səmərəli olduğu ssenariləri var və HTTP spesifikasiyasının tövsiyəsi hər iki başlığı birlikdə istifadə etməkdir.
| Meyar | Last-Modified | ETag |
|---|---|---|
| Mahiyyət | Son dəyişiklik tarixi | Unikal versiya identifikatoru |
| Dəqiqlik | Saniyəyə qədər | Bitə qədər (heş) |
| Reallaşdırma mürəkkəbliyi | Aşağı — fayl sistemindən avtomatik | Orta — heşin hesablanması tələb olunur |
| Klaster serverlər | Problem: mtime qovşaqlarda fərqlənə bilər | Eyni məlumatlarla qovşaqlarda sabit |
| Diapazon dəstəyi | Range sorğularına təsir etmir | Diapazonlar üçün güclü ETag tələb edir |
| Tövsiyə | Statika və sadə API-lər üçün | Dəqiq yoxlama vacib olan API-lər üçün |
Last-Modified-in əsas üstünlüyü sadəlikdir. Server məzmunun heşini hesablamalı deyil ki, bu da hər sorğuda CPU resurslarına qənaət edir. Yüksək yüklü layihələr üçün statik fayllar və ya aydın vaxt damğası olan məlumatlar ötürürkən Last-Modified optimal seçim olaraq qalır. ETag isə mütləq dəqiqlik verir — JSON cavabında bir hərfin dəyişməsi ETag-i dəyişdirəcək, lakin tarixi dəyişdirməyə bilər (fayl eyni versiya ilə üzərinə yazılıbsa).
Spesifikasiya hər iki başlığın eyni vaxtda qaytarılmasını tövsiyə edir. Server 200 OK cavabına həm Last-Modified, həm də ETag daxil edir. Müştəri hər iki şərti başlığı — If-Modified-Since və If-None-Match göndərir. Server əvvəlcə ETag-i yoxlayır (üstünlük variantı), sonra Last-Modified-i. Heç olmasa biri dəyişiklik siqnalı verirsə — tam cavab qaytarılır. Bu, maksimal elastiklik təmin edir: ETag dəqiqlik, Last-Modified isə ETag dəstəkləməyən müştərilər üçün ehtiyat yoxlama təmin edir.
Last-Modified konfiqurasiyası serverin növündən asılıdır. Nginx və Apache üçün statik fayllara Last-Modified mtime əsasında avtomatik təyin edilir. Dinamik tətbiqlər üçün başlıq server kodunda təyin edilməlidir. Məşhur platformalarda konfiqurasiyaya baxaq.
// Express.js — Last-Modified təyini
app.get("/api/users", async (req, res) => {
const updatedAt = await getLastUpdate()
const ifModifiedSince = req.get("If-Modified-Since")
// If-Modified-Since yoxlanılması
if (ifModifiedSince && new Date(ifModifiedSince)
>= updatedAt) {
return res.status(304).end()
}
const users = await getUsers()
res.set("Last-Modified", updatedAt.toUTCString())
res.json(users)
})
Express.js nümunəsində server məlumatların son yenilənmə tarixini bazadan alır, müştəridən If-Modified-Since-i yoxlayır və keş aktualdırsa 304 qaytarır. Məlumatlar dəyişmişsə — yeni Last-Modified təyin edir və tam cavab qaytarır. toUTCString() tarixi tələb olunan HTTP formatına çevirir. İstehsalat mühitində hər müraciətdə verilənlər bazasına sorğu yerinə yetirməmək üçün updatedAt məlumatının Redis-də keşlənməsini əlavə etməyə dəyər.
Nginx statik fayllar üçün Last-Modified-i faylın son dəyişdirilmə vaxtına əsasən avtomatik təyin edir. Davranışı etag direktivi (ETag-i söndürmək) və ya ngx_http_headers_module modulu vasitəsilə dəyişdirmək və ya söndürmək olar. Backend-ə proksi sorğuları üçün Last-Modified dəyişmədən upstream cavabından ötürülür. Vacib: backend Last-Modified qaytarmırsa, Nginx onu dinamik cavablar üçün avtomatik əlavə etməyəcək.
Last-Modified-in bir neçə məlum məhdudiyyəti var. Əsası saniyəyə qədər dəqiqlikdir. Resurs bir saniyə ərzində iki dəfə dəyişmişsə, müştəri yeni versiyanı qaçıra bilər. Praktikada bu nadir ssenaridir, lakin yüksək tezlikli yeniləmələr (kotirovka lentləri, söhbətlər) üçün ETag tövsiyə olunur. İkinci məhdudiyyət klasterləşdirmə problemidir: müxtəlif serverlərdə fayl kopyalama və ya yerləşdirmə səbəbindən fərqli mtime-ə malik ola bilər, bu da Last-Modified-in uyğunsuz olmasına səbəb olur.
Üçüncü məhdudiyyət — saniyəyə qədər dəqiqliklə If-Modified-Since-in işlənməsi serverin tez-tez sorgulanması zamanı artıq sorğulara səbəb ola bilər. Müştəri hər 500 ms-də bir If-Modified-Since göndərirsə, server hər dəfə 200 OK qaytarır, çünki tarix dəyişməyib, lakin resurs əslində artıq yenilənib. Həll yolu ETag ilə birləşdirmədir: ETag saniyə ərzindəki dəyişikliyi tutacaq, Last-Modified isə ehtiyat variant olaraq qalacaq.
Dördüncü problem — Last-Modified eyni tarixə malik eyni resursun müxtəlif versiyalarını fərqləndirmir. Fayl ehtiyat nüsxadan bərpa edilmişsə və onun mtime orijinal ilə üst-üstə düşürsə, müştəri məzmunun dəyişdiyini görməyəcək. ETag bu problemi həll edir: məzmun heşi vaxt damğasından asılı olmayaraq hər hansı məlumat dəyişikliyində qərəntili şəkildə dəyişəcək. Kritik məlumatlar üçün həmişə hər iki başlıqdan istifadə edin.
Tez-tez verilən suallar
Yalnız GMT (Greenwich Mean Time) RFC 1123 formatında: həftənin günü, təqvim, ay, il, saat:dəqiqə:saniyə. Nümunə: Wed, 02 Jul 2025 14:30:00 GMT. Saat qurşağı həmişə GMT-dir, digər formatlara icazə verilmir.
Texniki olaraq ola bilər, lakin bu RFC 7232-ni pozur. Server gələcək tarix qaytarırsa, müştərilər həmin tarix çatana qədər resursu yeniləməyəcək. Belə konfiqurasiya səhv hesab olunur — tarix keçmişdə və ya indiki zamanda olmalıdır.
Xeyr, If-Modified-Since şərti sorğuları yalnız GET və HEAD ilə işləyir. POST sorğuları keşlənmir və tarixə görə valideyasiyadan istifadə etmir. POST üçün məlumatların aktual olub-olmadığını yoxlamaq üçün ETag və ya xüsusi mexanizmlərdən istifadə edin.
Cache-Control keşləmə siyasətini (maksimum saxlama müddəti, kimin keşləyə biləcəyini) müəyyən edir, Last-Modified isə köhnəlmiş keşin valideyasiya mexanizmidir. max-age müddəti bitdikdən sonra müştəri aktual olub-olmadığını yoxlamaq üçün If-Modified-Since göndərir.
Serverin başlığı aktual mənbədən — verilənlər bazası, fayl sistemi və ya API-dən təyin etdiyini yoxlayın. Dinamik cavablar üçün işləyici kodda res.setHeader(“Last-Modified”, ...) açıq şəkildə çağırdığınıza əmin olun.
Nəticə
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.
Həm də oxuyun