Ketika saya mengunjungi chesseng.herokuapp.com saya mendapatkan tajuk respons yang mirip
Cache-Control:private
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/css
Date:Tue, 16 Oct 2012 06:37:53 GMT
Last-Modified:Tue, 16 Oct 2012 03:13:38 GMT
Status:200 OK
transfer-encoding:chunked
Vary:Accept-Encoding
X-Rack-Cache:miss
dan kemudian saya me-refresh halaman dan mendapatkan
Cache-Control:private
Connection:keep-alive
Date:Tue, 16 Oct 2012 06:20:49 GMT
Status:304 Not Modified
X-Rack-Cache:miss
jadi sepertinya caching berfungsi. Jika itu berhasil untuk caching maka apa gunanya Expires and Cache-Control: max-age . Untuk menambah kebingungan, ketika saya menguji halaman di https://developers.google.com/speed/pagespeed/insights/ itu memberitahu saya untuk "Leverage caching browser".
http
caching
http-headers
browser-cache
cache-control
pengguna782220
sumber
sumber
Jawaban:
Untuk menjawab pertanyaan Anda tentang mengapa caching berfungsi, meskipun server-web tidak menyertakan header:
[a date]
[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:
Tetapi mereka memasukkan tanggal modifikasi terakhir dalam respon:
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:
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: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:
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 .Last-Modified
, browser harus melakukan permintaanIf-Modified-Since
, dan menonton untuk304 Not Modified
responsmax-age
, peramban bahkan tidak harus menderita jaringan pulang-pergi; konten akan keluar dari cachePerbedaan antara "Kontrol Tembolok: usia maks" dan "Kedaluwarsa"
Expires
adalah padanan setara dariCache-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
:Situs web apa pun yang ditulis setelah 1998 tidak boleh
Expires
lagi digunakan , dan sebagai gantinya digunakanmax-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: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):
Dan persis seperti dalam kasus permintaan bersyarat berdasarkan Last-Modified :
Saya dapat melakukan permintaan bersyarat berdasarkan ETag:
An
ETag
lebih unggul daripadaLast-Modified
karena berfungsi untuk hal-hal selain file , atau hal-hal yang memiliki gagasan tentang tanggal . Itu hanya merupakansumber
cache-control
tidak ada? Dan Anda hanya memiliki Etag? Bukankah masih perlu membuat 'permintaan bersyarat' terhadap server? Perilaku yang saya lihat saat offline adalah ia baru saja kembali dari cache. Tetapi ketika sedang offline itu tidak dapat membuat permintaan bersyarat itu. Jadi apakah itu berarti jika itu akan disimpan tanpa batas jika Anda tetap offline? Saya sudah menanyakan pertanyaan ini secara rinci di sini . Bisakah Anda melihatnya?Dari RFC2616 bagian 14.9.1
sumber
Cache-Control:private
hanya menyatakan bahwa cache bersama (seperti cache proxy) tidak boleh menembolokkan respons.proxy-revalidate
mengharuskan proxy selalu memvalidasi ulang pada setiap akses. Dimanaprivate
mencegah proxy dari caching.RFC 2616, bagian 14.9.1 :
Browser dapat menggunakan informasi ini. Tentu saja, "pengguna" saat ini dapat berarti banyak hal: pengguna OS, pengguna browser (misalnya profil Chrome), dll. Ini tidak ditentukan.
Bagi saya, contoh yang lebih konkret dari
Cache-Control: private
adalah bahwa server proxy (yang biasanya memiliki banyak pengguna) tidak akan cache itu. Ini dimaksudkan untuk pengguna akhir, dan tidak ada orang lain.FYI, RFC menjelaskan bahwa ini tidak memberikan keamanan. Ini tentang menunjukkan konten yang benar, bukan mengamankan konten.
sumber
Bidang header-entitas Kedaluwarsa memberikan tanggal / waktu setelah respons dianggap basi. Kontrol cache: bidang maks. Memberi nilai usia (dalam detik) lebih besar daripada respons yang dianggap basi.
Meskipun bidang header di atas memberikan mekanisme kepada klien untuk memutuskan apakah akan mengirim permintaan ke server. Dalam beberapa kondisi, klien mengirim permintaan untuk memutuskan dan nilai usia respons lebih besar daripada nilai maksimal, dosis itu berarti server perlu mengirim sumber daya ke klien? Mungkin sumber dayanya tidak pernah berubah.
Untuk mengatasi masalah ini, HTTP1.1 memberikan head yang terakhir dimodifikasi. Server memberikan tanggal respons terakhir yang diubah ke klien. Ketika klien membutuhkan sumber daya ini, ia akan mengirimkan bidang kepala If-Modified-Sejak ke server. Jika tanggal ini sebelum tanggal modifikasi sumber daya, server akan mengirimkan sumber daya ke klien dan memberikan 200 kode. Jika tidak, ia akan mengembalikan 304 kode ke klien dan ini berarti klien dapat menggunakan sumber daya yang di-cache.
sumber