Untuk menjawab pertanyaan Anda tentang mengapa caching berfungsi, meskipun server-web tidak menyertakan header:
- Kedaluwarsa:
[a date]
- Kontrol Cache: max-age =
[seconds]
Server dengan hormat meminta proksi perantara untuk tidak menembolok konten (mis. Item tersebut hanya boleh di-cache dalam cache pribadi , yaitu hanya pada mesin lokal Anda sendiri):
Tetapi server lupa untuk memasukkan segala jenis petunjuk caching:
- mereka lupa menyertakan Kedaluwarsa , sehingga browser tahu untuk menggunakan salinan yang di-cache hingga tanggal itu
- mereka lupa menyertakan Max-Age , sehingga browser tahu berapa lama item yang di-cache itu bagus
- mereka lupa menyertakan E-Tag , sehingga browser dapat melakukan permintaan bersyarat
Tetapi mereka memasukkan tanggal modifikasi terakhir dalam respon:
Last-Modified: Tue, 16 Oct 2012 03:13:38 GMT
Karena browser tahu tanggal file diubah, ia dapat melakukan permintaan bersyarat . Ini akan meminta server untuk file, tetapi memerintahkan server untuk hanya mengirim file jika sudah dimodifikasi sejak 2012/10/16 3:13:38:
GET / HTTP/1.1
If-Modified-Since: Tue, 16 Oct 2012 03:13:38 GMT
Server menerima permintaan, menyadari bahwa klien sudah memiliki versi terbaru. Alih-alih mengirim klien 200 OK
, diikuti oleh konten halaman, alih-alih itu memberi tahu Anda bahwa versi cache Anda baik:
304 Not Modified
Peramban Anda harus mengalami keterlambatan pengiriman permintaan ke server, dan menunggu jawaban, tetapi itu memang menghemat karena harus mengunduh ulang konten statis.
Mengapa Max-Age ? Kenapa Berakhir? ?
Karena Last-Modified sucks.
Tidak semua yang ada di server memiliki tanggal yang terkait dengannya. Jika saya membuat halaman dengan cepat, tidak ada tanggal yang terkait dengannya - sekarang . Tapi saya sangat ingin membiarkan pengguna men-cache homepage selama 15 detik:
200 OK
Cache-Control: max-age=15
Jika pengguna palu F5 , mereka akan terus mendapatkan versi cache selama 15 detik. Jika itu adalah proksi perusahaan, maka semua pengguna 67198 yang memukul halaman yang sama dalam jendela 15 detik yang sama semua akan mendapatkan konten yang sama - semua disajikan dari cache yang dekat. Kinerja menang untuk semua orang.
Keunggulan dari menambahkan Cache-Control: max-age
adalah bahwa browser bahkan tidak harus melakukan permintaan bersyarat .
- jika Anda hanya menentukan
Last-Modified
, browser harus melakukan permintaan If-Modified-Since
, dan menonton untuk304 Not Modified
respons
- jika Anda tentukan
max-age
, peramban bahkan tidak harus menderita jaringan pulang-pergi; konten akan keluar dari cache
Perbedaan antara "Kontrol Tembolok: usia maks" dan "Kedaluwarsa"
Expires
adalah padanan setara dari Cache-Control: max-age
tajuk modern (c. 1998) :
Expires
: Anda menentukan tanggal (yuck)
max-age
: Anda tentukan detik (ya ampun)
Dan jika keduanya ditentukan, maka browser menggunakan max-age
:
200 OK
Cache-Control: max-age=60
Expires: 20180403T192837
Situs web apa pun yang ditulis setelah 1998 tidak boleh Expires
lagi digunakan , dan sebagai gantinya digunakan max-age
.
Apa itu ETag?
ETag mirip dengan Last-Modified , kecuali bahwa itu tidak harus menjadi tanggal - itu hanya harus menjadi sesuatu .
Jika saya menarik daftar produk dari database, server dapat mengirim yang terakhir rowversion
sebagai ETag, bukan tanggal:
200 OK
ETag: "247986"
ETag saya dapat berupa hash SHA1 dari sumber daya statis (mis. Gambar, js, css, font), atau halaman yang di-cache di-cache (yaitu inilah yang dilakukan wiki Mozilla MDN; mereka meng-hasup markup terakhir):
200 OK
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
Dan persis seperti dalam kasus permintaan bersyarat berdasarkan Last-Modified :
GET / HTTP/1.1
If-Modified-Since: Tue, 16 Oct 2012 03:13:38 GMT
304 Not Modified
Saya dapat melakukan permintaan bersyarat berdasarkan ETag:
GET / HTTP/1.1
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
304 Not Modified
An ETag
lebih unggul daripada Last-Modified
karena berfungsi untuk hal-hal selain file , atau hal-hal yang memiliki gagasan tentang tanggal . Itu hanya merupakan