Web sunucusu üstbilgileri içermese bile önbelleğe almanın neden çalıştığıyla ilgili sorunuza cevap vermek için:
- Bitiş tarihi:
[a date]
- Önbellek Kontrolü: max-age =
[seconds]
Sunucu, herhangi bir ara proxy'den içeriği önbelleğe almamasını istedi (yani öğe yalnızca özel bir önbellekte, yani yalnızca kendi yerel makinenizde önbelleğe alınmalıdır ):
Ancak sunucu her türlü önbelleğe alma ipucunu eklemeyi unuttu:
- Expires eklemeyi unuttular , böylece tarayıcı önbelleğe alınmış kopyayı o tarihe kadar kullanacağını bilir
- Max-Age eklemeyi unuttular , böylece tarayıcı önbelleğe alınan öğenin ne kadar süreyle
- tarayıcı koşullu bir istekte bulunabilmesi için E-Etiket eklemeyi unuttular
Ancak yanıta bir Son Değiştirilme tarihi eklediler:
Last-Modified: Tue, 16 Oct 2012 03:13:38 GMT
Tarayıcı, dosyanın değiştirildiği tarihi bildiğinden, koşullu bir istek gerçekleştirebilir . Sunucudan dosyayı isteyecek, ancak sunucuya dosyayı yalnızca 2012/10/16 3:13:38 tarihinden bu yana değiştirilmişse göndermesi talimatını verecektir:
GET / HTTP/1.1
If-Modified-Since: Tue, 16 Oct 2012 03:13:38 GMT
Sunucu isteği alır ve istemcinin halihazırda en son sürüme sahip olduğunu fark eder. İstemciyi 200 OKve ardından sayfanın içeriğini göndermek yerine, önbelleğe alınmış sürümünüzün iyi olduğunu söyler:
304 Not Modified
Tarayıcınız, sunucuya bir istek gönderme gecikmesi yaşamalı ve bir yanıt beklemeliydi, ancak statik içeriği yeniden indirmek zorunda kalmadı.
Neden Max-Age ? Neden Süresi Doluyor ?
Çünkü Last-Modified berbat.
Sunucuda Her şey vardır kendisiyle ilişkili bir tarih. Anında bir sayfa oluşturuyorsam, onunla ilişkili bir tarih yok - şimdi . Ancak, kullanıcının ana sayfayı 15 saniye boyunca önbelleğe almasına kesinlikle izin veriyorum:
200 OK
Cache-Control: max-age=15
Kullanıcı çekiçlerse F5, önbelleğe alınmış sürümü 15 saniye boyunca almaya devam edecekler. Kurumsal bir proxy ise, aynı 15 saniyelik pencerede aynı sayfaya giren 67198 kullanıcının tümü aynı içeriği alacaktır - tümü yakın önbellekten sunulur. Herkes için performans kazancı.
Eklemenin erdemi Cache-Control: max-age, tarayıcının koşullu bir istek gerçekleştirmesine bile gerek olmamasıdır .
- yalnızca belirttiyseniz
Last-Modified, tarayıcının bir istek gerçekleştirmesi If-Modified-Sinceve bir 304 Not Modifiedyanıt beklemesi gerekir
- Eğer
max-agebelirtmişseniz, tarayıcının ağ gidiş-dönüşünden zarar görmesi gerekmeyecektir; içerik doğrudan önbelleklerden çıkacak
"Cache-Control: max-age" ve "Expires" arasındaki fark
Expiresmodern (c. 1998) Cache-Control: max-agebaşlığın eski eşdeğeridir :
Expires: bir tarih belirlersiniz (iğrenç)
max-age: saniye belirtirsiniz (iyilik)
Ve her ikisi de belirtilirse, tarayıcı max-ageşunları kullanır :
200 OK
Cache-Control: max-age=60
Expires: 20180403T192837
1998'den sonra yazılan hiçbir web sitesi Expiresartık kullanılmamalı, onun yerine kullanılmalıdır max-age.
ETag nedir?
ETag , bir tarih olması gerekmemesi dışında Last-Modified'a benzer - sadece bir şey olması gerekir .
Veritabanından bir ürün listesi çıkarıyorsam, sunucu sonuncuyu rowversiontarih yerine ETag olarak gönderebilir :
200 OK
ETag: "247986"
ETag'im, statik bir kaynağın (ör. Resim, js, css, yazı tipi) veya önbelleğe alınmış işlenmiş sayfanın SHA1 karması olabilir (yani, Mozilla MDN wiki'nin yaptığı şey budur; son işaretlemeyi karma haline getirirler):
200 OK
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
Ve aynen Last-Modified'a dayalı bir koşullu istek durumunda olduğu gibi :
GET / HTTP/1.1
If-Modified-Since: Tue, 16 Oct 2012 03:13:38 GMT
304 Not Modified
ETag'a göre şartlı bir talep gerçekleştirebilirim :
GET / HTTP/1.1
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
304 Not Modified
An ETagdaha üstündür Last-Modifiedçünkü dosyalar dışındaki şeyler için veya tarih kavramı olan şeyler için çalışır . Bu sadece bir