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 OK
ve 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-Since
ve bir 304 Not Modified
yanıt beklemesi gerekir
- Eğer
max-age
belirtmiş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
Expires
modern (c. 1998) Cache-Control: max-age
baş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 Expires
artı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 rowversion
tarih 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 ETag
daha üstündür Last-Modified
çünkü dosyalar dışındaki şeyler için veya tarih kavramı olan şeyler için çalışır . Bu sadece bir