Last-Modified — serverdagi resursning oxirgi oʻzgartirilgan sanasi va vaqtini koʻrsatuvchi HTTP javob sarlavhasi boʻlib, mijozga If-Modified-Since orqali shartli soʻrovlarni bajarishga imkon beradi. Agar resurs koʻrsatilgan sanadan beri oʻzgarmagan boʻlsa, server javob tanasini uzatmasdan 304 Not Modified qaytaradi, bu esa trafikni sezilarli darajada tejaydi. RFC 7232 (IETF, 2014) maʻlumotlariga koʻra, Last-Modified bilan shartli soʻrovlar takroriy tashriflarda sahifalarni yuklash vaqtini 30–60% qisqartiradi. Sarlavha aksariyat HTTP serverlari va proksilar tomonidan avtomatik qoʻllab-quvvatlanadi.
Asosiy fikrlar
Last-Modified — shartli soʻrovlar (conditional requests) sarlavhalar guruhiga kiruvchi HTTP sarlavhasidir. Server uni GET yoki HEAD javobiga qoʻshib, soʻralgan resursning oxirgi oʻzgartirilgan sanasi va vaqtini HTTP-date formatida koʻrsatadi: Last-Modified: Wed, 02 Jul 2025 14:30:00 GMT. Mijoz (brauzer, mobil ilova, proksi) bu sanani keshlashtirilgan resurs bilan birga saqlaydi. Takroriy soʻrovda mijoz If-Modified-Since sarlavhasini xuddi shu sana bilan yuboradi va server uni resursning joriy oʻzgarish vaqti bilan solishtiradi.
Last-Modified bilan shartli soʻrovlar protokoli RFC 7232 da belgilangan va barcha zamonaviy HTTP serverlari tomonidan qoʻllab-quvvatlanadi. Sana formati qatʻiy tartibga solingan — faqat GMT (Greenwich Mean Time) vaqt mintaqasi koʻrsatilmasdan. Server sanani uchta mumkin boʻlgan formatda qaytarishi mumkin: RFC 1123 (standart), RFC 850 (eskirgan) yoki ANSI C asctime. Amalda deyarli barcha serverlar 29 belgidan iborat qatʻiy uzunlikdagi RFC 1123 formatidan foydalanadi.
Last-Modified keshni tekshirish mexanizmlari toifasiga kiradi: u mijozga javobni keshlash mumkinligini aytmaydi, balki allaqachon keshlashtirilgan resursning dolzarbligini tekshirish vositasi beradi. Keshlashtirish siyosati Cache-Control sarlavhasi orqali alohida belgilanadi. Akamai (2025) tadqiqotiga koʻra, Last-Modified ni Cache-Control bilan birgalikda toʻgʻri sozlash statik kontent uchun origin serverlaridagi yukni 70% gacha kamaytiradi.
Last-Modified sarlavhasi hali HTTP/1.0 (RFC 1945, 1996) da belgilangan va vebda keshni boshqarishning dastlabki mexanizmlaridan biri boʻlgan. ETag HTTP/1.1 da paydo boʻlgunga qadar, shartli soʻrovlarni bajarishning yagona usuli edi. Yoshiga qaramay, sarlavha soddaligi tufayli dolzarb boʻlib qolmoqda — server kontentning hashini hisoblashi shart emas, faqat fayl tizimidan fayl timestamp ini yoki maʻlumotlar bazasidan updated_at maydonini oʻqish kifoya.
Toʻliq sikl uch bosqichni oʻz ichiga oladi. Birinchi soʻrovda server resursni Last-Modified sarlavhasi va 200 OK HTTP statusi bilan qaytaradi. Mijoz javobni sana bilan birga keshlashtiradi. Takroriy soʻrovda mijoz saqlangan sana bilan If-Modified-Since sarlavhasini yuboradi. Server bu sanani resursning joriy oʻzgarish vaqti bilan solishtiradi. Resurs oʻzgarmagan boʻlsa — boʻh tana bilan 304 Not Modified qaytariladi. Oʻzgargan boʻlsa — yangi maʻlumotlar va yangi Last-Modified bilan 200 OK qaytariladi.
// Birinchi soʻrov — server resursni sana bilan qaytaradi
HTTP/1.1 200 OK
Content-Type: application/json
Last-Modified: Wed, 02 Jul 2025 14:30:00 GMT
[{"id": 1, "name": "Alice"}]
// Takroriy soʻrov — mijoz saqlangan sanani yuboradi
GET /api/users HTTP/1.1
Host: example.com
If-Modified-Since: Wed, 02 Jul 2025 14:30:00 GMT
// Javob — maʻlumotlar oʻzgarmagan
HTTP/1.1 304 Not Modified
Mobil ilovalar uchun Last-Modified maʻlumotlarni sinxronlashda ayniqsa foydali. Ilova oxirgi muvaffaqiyatli yangilanish sanasini saqlaydi va uni serverga If-Modified-Since da yuboradi. Agar maʻlumotlar koʻp boʻlsa yoki oʻzgargan boʻlsa — server toʻliq toʻplamni qaytaradi. Aks holda — 304, va ilova mahalliy nusxadan foydalanadi. OkHttp va URLSession bu mexanizmni oʻrnatilgan kesh tizimlari orqali avtomatik qoʻllab-quvvatlaydi.
Statik fayllar uchun Nginx va Apache sanani fayl tizimi atributlaridan — mtime (oʻzgartirish vaqti) oladi. Dinamik kontent uchun server kodi biznes mantigʻiga asoslangan holda Last-Modified ni aniq belgilashi kerak: maʻlumotlar bazasidagi updated_at maydoni, Git-dagi oxirgi commit sanasi, artefakt qurilish timestemp. Agar Last-Modified aniq belgilanmagan boʻlsa, server sarlavhani umuman qaytarmasligi mumkin va mijoz sana boʻyicha shartli soʻrovlar bajarolmaydi.
Last-Modified va ETag oʻxshash vazifani bajaradi — mijozga keshning dolzarbligini tekshirish imkonini beradi — ammo tub farqlarga ega. Last-Modified vaqt belgisidan foydalanadi, ETag — noyob versiya identifikatoridan. Har bir yondashuvning oʻzi samaraliroq boʻlgan stsenariylari bor va HTTP spetsifikatsiyasining tavsiyasi ikkala sarlavhani birgalikda ishlatishdir.
| Mezon | Last-Modified | ETag |
|---|---|---|
| Mohiyat | Oxirgi oʻzgartirish sanasi | Noyob versiya identifikatori |
| Aniqlik | Soniyagacha | Bitgacha (hash) |
| Amalga oshirish murakkabligi | Past — fayl tizimidan avtomatik | Oʻrta — hash hisoblash talab qilinadi |
| Klasterli serverlar | Muammo: mtime tugunlarda farq qilishi mumkin | Tugunlarda bir xil maʻlumotlar bilan barqaror |
| Diapazonlarni qoʻllab-quvvatlash | Range soʻrovlariga taʻsir qilmaydi | Diapazonlar uchun kuchli ETag talab qiladi |
| Tavsiya | Statika va sodda API uchun | Aniq tekshirish muhim boʻlgan API uchun |
Last-Modified ning asosiy afzalligi — soddalik. Server kontentning hashini hisoblashi shart emas, bu har bir soʻrovda CPU resurslarini tejaydi. Yuqori yuklangan loyihalar uchun statik fayllar yoki aniq vaqt belgilari boʻlgan maʻlumotlarni yetkazib berishda Last-Modified optimal tanlov boʻlib qoladi. ETag esa mutlaq aniqlik beradi — JSON javobidagi bitta harfning oʻzgarishi ETagni oʻzgartiradi, lekin sanani oʻzgartirmasligi mumkin (agar fayl bir xil versiya bilan qayta yozilgan boʻlsa).
Spetsifikatsiya ikkala sarlavhani bir vaqtning oʻzida qaytarishni tavsiya qiladi. Server 200 OK javobiga ham Last-Modified, ham ETagni qoʻshadi. Mijoz ikkala shartli sarlavhani — If-Modified-Since va If-None-Match ni yuboradi. Server avval ETagni (ustuvorlikka ega), keyin Last-Modified ni tekshiradi. Agar kamida bittasi oʻzgarish haqida signal bersa — toʻliq javob qaytariladi. Bu maksimal moslashuvchanlikni taʻminlaydi: ETag aniqlikni, Last-Modified esa ETagni qoʻllab-quvvatlamaydigan mijozlar uchun zaxira tekshiruvni taʻminlaydi.
Last-Modified sozlamalari server turiga bogʻliq. Nginx va Apache uchun statik fayllarga Last-Modified mtime asosida avtomatik oʻrnatiladi. Dinamik ilovalar uchun sarlavha server kodida oʻrnatilishi kerak. Mashhur platformalarda sozlashni koʻrib chiqaylik.
// Express.js — Last-Modified ni oʻrnatish
app.get("/api/users", async (req, res) => {
const updatedAt = await getLastUpdate()
const ifModifiedSince = req.get("If-Modified-Since")
// If-Modified-Since tekshiruvi
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 misolida server maʻlumotlarning oxirgi yangilanish sanasini bazadan oladi, mijozdan If-Modified-Since ni tekshiradi va kesh dolzarb boʻlsa 304 qaytaradi. Agar maʻlumotlar oʻzgargan boʻlsa — yangi Last-Modified oʻrnatadi va toʻliq javob qaytaradi. toUTCString() sanani kerakli HTTP formatiga oʻzgartiradi. Ishlab chiqarish muhitida har bir murojaatda maʻlumotlar bazasiga soʻrov yubormaslik uchun updatedAt ni Redisda keshlashtirishni qoʻshishga arziydi.
Nginx statik fayllar uchun Last-Modified ni faylning oxirgi oʻzgartirilgan vaqtiga asoslanib avtomatik oʻrnatadi. Xatti-harakatni etag direktivasi (ETagni oʻchirish) yoki ngx_http_headers_module moduli orqali oʻchirish yoki oʻzgartirish mumkin. Backendga proksi soʻrovlari uchun Last-Modified oʻzgarishsiz upstream javobidan uzatiladi. Muhim: agar backend Last-Modified ni qaytarmasa, Nginx uni dinamik javoblar uchun avtomatik qoʻshmaydi.
Last-Modified bir nechta maʻlum cheklovlarga ega. Asosiysi — soniyagacha aniqlik. Agar resurs bir soniya ichida ikki marta oʻzgargan boʻlsa, mijoz yangi versiyani oʻtkazib yuborishi mumkin. Amalda bu kamdan-kam stsenariy, lekin yuqori chastotali yangilanishlar (kotirovka lentalari, chatlar) uchun ETag tavsiya etiladi. Ikkinchi cheklov klasterlashtirish muammosi: turli serverlarda fayl nusxalash yoki joylashtirish sababli turli mtime ga ega boʻlishi mumkin, bu esa Last-Modified ning mos kelmasligiga olib keladi.
Uchinchi cheklov — soniyagacha aniqlik bilan If-Modified-Since ni qayta ishlash serverni tez-tez soʻrashda ortiqcha soʻrovlarga olib kelishi mumkin. Agar mijoz har 500 ms da If-Modified-Since yuborsa, server har safar 200 OK qaytaradi, chunki sana oʻzgarmagan, lekin resurs aslida allaqachon yangilangan. Yechim ETag bilan kombinatsiya: ETag soniya ichidagi oʻzgarishni ushlaydi, Last-Modified esa zaxira sifatida qoladi.
Toʻrtinchi muammo — Last-Modified bir xil sanaga ega boʻlgan bir resursning turli versiyalarini farqlamaydi. Agar fayl zaxiradan tiklanga boʻlsa va uning mtime asl nusxa bilan bir xil boʻlsa, mijoz kontent oʻzgarganini sezmaydi. ETag bu muammoni hal qiladi: kontent hash vaqt belgisidan qatʻiy nazar, har qanday maʻlumot oʻzgarishida kafolatlangan holda oʻzgaradi. Kritik maʻlumotlar uchun har doim ikkala sarlavhadan foydalaning.
Tez-tez soʻraladigan savollar
Faqat GMT (Greenwich Mean Time) RFC 1123 formatida: hafta kuni, sana, oy, yil, soat:daqiqa:soniya. Misol: Wed, 02 Jul 2025 14:30:00 GMT. Vaqt mintaqasi har doim GMT, boshqa formatlarga ruxsat berilmaydi.
Texnik jihatdan mumkin, ammo bu RFC 7232 ni buzadi. Agar server kelajakdagi sanani qaytarsa, mijozlar oʻsha sana kelguncha resursni yangilamaydi. Bunday konfiguratsiya xato hisoblanadi — sana oʻtmishda yoki hozirgi zamonda boʻlishi kerak.
Yoʻq, If-Modified-Since shartli soʻrovlari faqat GET va HEAD bilan ishlaydi. POST soʻrovlari keshlashtirilmaydi va sana boʻyicha tekshirishdan foydalanmaydi. POST maʻlumotlarining dolzarbligini tekshirish uchun ETag yoki maxsus mexanizmlardan foydalaning.
Cache-Control kesh siyosatini (maksimal saqlash vaqti, kim keshlashtirishi mumkin) belgilaydi, Last-Modified esa eskirgan keshni tekshirish mexanizmidir. max-age muddati tugagandan soʻng, mijoz If-Modified-Since ni tekshirish uchun yuboradi.
Server sarlavhani haqiqiy manbadan — maʻlumotlar bazasi, fayl tizimi yoki API dan oʻrnatayotganini tekshiring. Dinamik javoblar uchun ishlov berish kodida res.setHeader(“Last-Modified”, ...) ni aniq chaqirayotganingizga ishonch hosil qiling.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.