Last-Modified — egy HTTP válaszfejléc, amely az erőforrás utolsó módosításának dátumát és időpontját jelzi a szerveren, lehetővé téve az üfélnek, hogy feltételes kéréseket hajtson végre az If-Modified-Since segítségével. Ha az erőforrás nem változott a megadott dátum óta, a szerver 304 Not Modified választ ad a válasz törzsének elküldése nélkül, ami jelentősen spórolja a sávszélességet. A RFC 7232 (IETF, 2014) szerint a Last-Modified-dzsel ellátott feltételes kérések 30–60%-kal csökkentik az oldalak betöltési idejét ismételt látogatások esetén. A fejlécet a legtöbb HTTP szerver és proxy automatikusan támogatja.
Főbb pontok
Last-Modified — egy HTTP fejléc, amely a feltételes kérések (conditional requests) fejléccsoportjába tartozik. A szerver hozzáadja a GET vagy HEAD válaszhoz, jelezve a kért erőforrás utolsó módosításának dátumát és időpontját HTTP-date formátumban: Last-Modified: Wed, 02 Jul 2025 14:30:00 GMT. Az üfél (böngésző, mobilalkalmazás, proxy) ezt a dátumot a gyorsítótárazott erőforrással együtt tárolja. Ismételt kérésnél az üfél elküldi az If-Modified-Since fejlécet ugyanazzal a dátummal, és a szerver összehasonlítja azt az erőforrás aktuális módosítási idejével.
A Last-Modified-dzsel történő feltételes kérések protokollját az RFC 7232 határozza meg, és minden modern HTTP szerver támogatja. A dátumformátum szigorúan szabályozott — csak GMT (Greenwich Mean Time) időzóna megjelölése nélkül. A szerver három lehetséges formátumban küldheti vissza a dátumot: RFC 1123 (szabvány), RFC 850 (elavult) vagy ANSI C asctime. A gyakorlatban szinte minden szerver a 29 karakter fix hosszúságú RFC 1123 formátumot használja.
A Last-Modified a gyorsítótár érvényesítő mechanizmusainak kategóriájába tartozik: nem mondja meg az üfélnek, hogy lehet-e gyorsítótárazni a választ, hanem eszközt biztosít a már gyorsítótárazott erőforrás aktualitásának ellenőrzésére. A gyorsítótárazási irányelvet külön a Cache-Control fejlécen keresztül kell beállítani. A Akamai (2025) kutatása szerint a Last-Modified helyes beállítása a Cache-Control-lal együtt akár 70%-kal is csökkentheti a kiszolgáló szerverek terhelését statikus tartalom esetében.
A Last-Modified fejlécet már a HTTP/1.0-ban (RFC 1945, 1996) definiálták, és az egyik első gyorsítótár-kezelő mechanizmus volt a weben. Az ETag HTTP/1.1-ben történő megjelenése előtt ez volt az egyetlen mód feltételes kérések végrehajtására. Kora ellenére a fejléc egyszerűségének köszönhetően továbbra is releváns — a szervernek nem kell kiszámítania a tartalom hash-ét, elég a fájl időbélyegét kiolvasni a fájlrendszerből vagy az updated_at mezőt az adatbázisból.
A teljes ciklus három szakaszból áll. Az első kérésnél a szerver visszaküldi az erőforrást a Last-Modified fejléccel és a 200 OK HTTP állapottal. Az üfél gyorsítótárazza a választ a dátummal együtt. Ismételt kérésnél az üfél elküldi az If-Modified-Since fejlécet a tárolt dátummal. A szerver összehasonlítja ezt a dátumot az erőforrás aktuális módosítási idejével. Ha az erőforrás nem változott — 304 Not Modified válasz kerül visszaküldésre üres törzssel. Ha változott — 200 OK új adatokkal és új Last-Modified-dzsel.
// Első kérés — a szerver visszaküldi az erőforrást a dátummal
HTTP/1.1 200 OK
Content-Type: application/json
Last-Modified: Wed, 02 Jul 2025 14:30:00 GMT
[{"id": 1, "name": "Alice"}]
// Ismételt kérés — az üfél elküldi a tárolt dátumot
GET /api/users HTTP/1.1
Host: example.com
If-Modified-Since: Wed, 02 Jul 2025 14:30:00 GMT
// Válasz — az adatok nem változtak
HTTP/1.1 304 Not Modified
Mobilalkalmazások számára a Last-Modified különösen hasznos az adatszinkronizáláskor. Az alkalmazás tárolja az utolsó sikeres frissítés dátumát, és elküldi a szervernek az If-Modified-Since-ben. Ha több adat van, vagy azok megváltoztak — a szerver visszaküldi a teljes készletet. Ha nem — 304, és az alkalmazás a helyi másolatot használja. Az OkHttp és az URLSession automatikusan támogatja ezt a mechanizmust a beépített gyorsítótárazó rendszereken keresztül.
Statikus fájlok esetében az Nginx és az Apache a dátumot a fájlrendszer attribútumabból veszi — mtime (módosítás ideje). Dinamikus tartalom esetében a szerverkódnak explicit módon kell beállítania a Last-Modified-et üzleti logika alapján: az adatbázis updated_at mezője, az utolsó commit dátuma Git-ben, az építési időbélyeg. Ha a Last-Modified nincs explicit beállítva, a szerver előfordulhat, hogy egyáltalán nem küldi vissza a fejlécet, és az üfél nem tud feltételes kéréseket végrehajtani dátum alapján.
A Last-Modified és az ETag hasonló feladatot lát el — lehetővé teszi az üfél számára a gyorsítótár aktualitásának ellenőrzését — de alapvető különbségekkel rendelkeznek. A Last-Modified időbélyeget használ, az ETag — egyedi verzióazonosítót. Mindkét megközelítésnek megvannak a maga forgatókönyvei, ahol hatékonyabb, és a HTTP specifikáció ajánlása szerint mindkét fejlécet együtt kell használni.
| Szempont | Last-Modified | ETag |
|---|---|---|
| Lényeg | Utolsó módosítás dátuma | Egyedi verzióazonosító |
| Pontosság | Másodpercig | Bitig (hash) |
| Implementáció bonyolultsága | Alacsony — automatikusan a fájlrendszerből | Közepes – hash számítást igényel |
| Fürtözött szerverek | Probléma: az mtime csomópontonként eltérhet | Stabil azonos adatokkal a csomópontokon |
| Tartományok támogatása | Nem befolyásolja a Range kéréseket | Erős ETag-et igényel a tartományokhoz |
| Ajánlás | Statikus tartalomhoz és egyszerű API-hoz | API-hoz, ahol fontos a pontos ellenőrzés |
A Last-Modified fő előnye az egyszerűség. A szervernek nem kell kiszámítania a tartalom hash-ét, ami CPU-erőforrásokat spórol minden kérésnél. A nagy terhelésű projektek számára, amelyek statikus fájlokat vagy egyértelmű időbélyegekkel rendelkező adatokat szolgáltatnak, a Last-Modified továbbra is az optimális választás. Az ETag viszont abszolút pontosságot biztosít — egyetlen betű megváltoztatása a JSON válaszban megváltoztatja az ETag-et, de előfordulhat, hogy nem változtatja meg a dátumot (ha a fájlt ugyanazzal a verzióval írták felül).
A specifikáció azt ajánlja, hogy mindkét fejlécet egyszerre küldjük vissza. A szerver mind a Last-Modified-et, mind az ETag-et tartalmazza a 200 OK válaszban. Az üfél mindkét feltételes fejlécet — If-Modified-Since és If-None-Match — elküldi. A szerver először az ETag-et ellenőrzi (elsőbbsége van), majd a Last-Modified-et. Ha legalább az egyik változást jelez — a teljes válasz kerül visszaküldésre. Ez maximális rugalmasságot biztosít: az ETag pontosságot nyújt, a Last-Modified pedig tartalék ellenőrzést azoknak az üféleknek, amelyek nem támogatják az ETag-et.
A Last-Modified beállítása a szerver típusától függ. Nginx és Apache esetén a statikus fájlok automatikusan megkapják a Last-Modified-et az mtime alapján. Dinamikus alkalmazások esetén a fejlécet a szerver kódjában kell beállítani. Nézzük meg a konfigurációt a népszerű platformokon.
// Express.js — Last-Modified beállítása
app.get("/api/users", async (req, res) => {
const updatedAt = await getLastUpdate()
const ifModifiedSince = req.get("If-Modified-Since")
// If-Modified-Since ellenőrzése
if (ifModifiedSince && new Date(ifModifiedSince)
>= updatedAt) {
return res.status(304).end()
}
const users = await getUsers()
res.set("Last-Modified", updatedAt.toUTCString())
res.json(users)
})
Az Express.js példában a szerver lekéri az adatok utolsó frissítésének dátumát az adatbázisból, ellenőrzi az If-Modified-Since-et az üféltől, és ha a gyorsítótár aktuális, 304-et küld vissza. Ha az adatok megváltoztak — új Last-Modified-et állít be, és teljes választ küld. toUTCString() konvertálja a dátumot a szükséges HTTP formátumba. Éles környezetben érdemes hozzáadni az updatedAt gyorsítótárazását Redis-ben, hogy elkerüljük az adatbázis lekérdezést minden hozzáféréskor.
Az Nginx automatikusan beállítja a Last-Modified-et statikus fájlokhoz a fájl utolsó módosításának ideje alapján. A viselkedés letiltása vagy módosítása az etag irányelvvel (ETag letiltása) vagy az ngx_http_headers_module modulon keresztül lehetséges. A backendhez irányuló proxy kérések esetén a Last-Modified változatlanul kerül továbbításra az upstream válaszból. Fontos: ha a backend nem küld vissza Last-Modified-et, az Nginx nem adja hozzá automatikusan a dinamikus válaszokhoz.
A Last-Modified számos ismert korlátozással rendelkezik. A fő korlát a másodperc pontosság. Ha az erőforrás kétszer változott egy másodpercen belül, az üfél kihagyhatja az új verziót. A gyakorlatban ez ritka forgatókönyv, de nagy frekvenciájú frissítések esetén (árfolyam feedek, csevegések) az ETag ajánlott. A második korlátozás a fürtözési probléma: különböző szervereken a fájl másolás vagy telepítés miatt eltérő mtime-mal rendelkezhet, ami a Last-Modified inkonzisztenciájához vezet.
A harmadik korlátozás — az If-Modified-Since másodperc pontosságú feldolgozása a szerver gyakori lekérdezése esetén többlet kérésekhez vezethet. Ha az üfél 500 ms-enként küld If-Modified-Since-et, a szerver minden alkalommal 200 OK-t küld vissza, mert a dátum nem változott, de az erőforrás valójában már frissölt. A megoldás kombinálás az ETag-dzsel: az ETag észleli a változást egy másodpercen belül, míg a Last-Modified tartalékként marad.
A negyedik probléma — a Last-Modified nem különbözteti meg ugyanazon erőforrás különböző verzióit azonos dátummal. Ha egy fájlt visszaállítottak egy biztonsági mentésből, és az mtime megegyezik az eredetivel, az üfél nem veszi észre, hogy a tartalom megváltozott. Az ETag megoldja ezt a problémát: a tartalom hash garantáltan megváltozik minden adatmódosításkor, függetlenül az időbélyegtől. Kritikus adatok esetén mindig használja mindkét fejlécet.
Gyakran Ismételt Kérdések
Csak GMT (Greenwich Mean Time) RFC 1123 formátumban: a hét napja, dátum, hónap, év, óra:perc:másodperc. Példa: Wed, 02 Jul 2025 14:30:00 GMT. Az időzóna mindig GMT, más formátumok nem megengedettek.
Technikailag lehet, de ez sérti az RFC 7232-t. Ha a szerver egy jövőbeli dátumot küld vissza, az üfélek nem frissítik az erőforrást a dátum beálltáig. Az ilyen konfiguráció hibának számít — a dátumnak a múltban vagy a jelenben kell lennie.
Nem, az If-Modified-Since feltételes kérések csak GET és HEAD esetén működnek. A POST kérések nem gyorsítótárazódnak és nem használnak dátum alapú érvényesítést. Az adatok aktualitásának ellenőrzéséhez POST esetén használjon ETag-et vagy egyedi mechanizmusokat.
A Cache-Control határozza meg a gyorsítótárazási irányelvet (maximális tárolási idő, ki gyorsítótárazhat), míg a Last-Modified a lejárt gyorsítótár érvényesítő mechanizmusa. A max-age lejárta után az üfél If-Modified-Since-et küld az aktualitás ellenőrzésére.
Ellenőrizze, hogy a szerver ténylegesen az aktuális forrásból — adatbázis, fájlrendszer vagy API — állítja-e be a fejlécet. Dinamikus válaszok esetén győződjön meg róla, hogy explicit módon meghívja a res.setHeader(„Last-Modified”, ...) függvényt a kezelő kódjában.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is