Mengapa tanggapan ini di-cache?

32

Saya memiliki klien yang index.html situsnya saat ini kembali dengan header ini:

Accept-Ranges: bytes
Koneksi: Keep-Alive
Content-Encoding: gzip
Panjang Konten: 3658
Jenis-Konten: teks / html
Tanggal: Kamis, 10 Okt 2013 07:36:27 GMT
ETag: "4aa95e1-2ed2-4e721324728b7"
Keep-Alive: batas waktu = 5, maks = 100
Terakhir Diubah: Sel, 24 Sep 2013 13:34:30 GMT
Server: Apache / 2.2.22
Vary: Accept-Encoding, User-Agent

Saya jelas akan merekomendasikan mereka menambahkan Expiresatau Cache-Controlsesuai, tapi saya bingung: Chrome cache sumber daya ini dan menggunakannya dari cache (tidak mengirim permintaan sama sekali ), bahkan setelah beberapa jam (misalnya, itu menggunakan kembali salinan itu di-cache kemarin jam 1:30 pagi ini jam 8:30 pagi). Saya dapat melihat ini dengan cukup jelas di tab Jaringan konsol Chrome, tempat ia memperlihatkan permintaan dan 200 (OK)berwarna abu-abu di kolom Status dan (from cache)di kolom Ukuran . (Saya belum mengubah default caching Chrome.)

Saya menyadari bahwa spesifikasi ini memungkinkan agen pengguna untuk membuat keputusan sendiri tanpa arah dari header. Apa itu yang terjadi di sini? Chrome melihat itu terakhir dimodifikasi beberapa hari yang lalu dan merasa bebas untuk menggunakan versi yang (katakanlah) ketinggalan zaman? Atau ada sesuatu yang saya lewatkan?

TJ Crowder
sumber

Jawaban:

33

Ketika "Berakhir" dan "Cache-Control" header tidak ditentukan, tetapi "Last-Modified" header yang ditentukan, browser harus menebak berapa lama mereka harus menjaga dokumen dalam cache. Beberapa browser memang menggunakan algoritma yang membiarkan halaman tetap dalam cache selama sehari atau lebih.

Status panduan praktik terbaik caching Google :

Terakhir Dimodifikasi adalah header caching "lemah" karena browser menerapkan heuristik untuk menentukan apakah akan mengambil item dari cache atau tidak. (Heuristik berbeda di antara browser yang berbeda.)


Mozilla (Firefox) memiliki FAQ Caching HTTP yang menguraikan algoritme mereka untuk situasi ini (walaupun ada kemungkinan bahwa algoritme telah berubah sejak dokumen bertanggal 2002):

... kami mencari tajuk "Terakhir Dimodifikasi". Jika tajuk ini ada, maka masa hidup kesegaran cache sama dengan nilai tajuk "Tanggal" dikurangi nilai tajuk "Terakhir diubah" dibagi 10.

Jadi, dalam kasus Anda di mana perbedaan antara dimodifikasi dan sekarang adalah 15 hari, maka Firefox akan menyimpan sumber daya selama 1,5 hari.

Tampaknya semua browser utama menggunakan aturan 10% yang sama dengan yang diterapkan Firefox. Sebuah pertanyaan telah diajukan pada StackOveflow meminta heuristik ini . Jawaban yang berbeda di sana untuk browser yang berbeda menunjukkan bahwa mereka semua memiliki implementasi yang serupa. Ada jawaban untuk Internet Explorer, dan Webkit (Chrome dan Safari).


Ukuran cache browser mungkin akan menjadi faktor pembatas untuk file yang ditentukan oleh algoritma caching dapat disimpan lebih dari satu hari. Browser umumnya memiliki pengaturan untuk jumlah ruang disk yang mereka gunakan untuk cache. Banyak pengguna juga menghapus cache mereka ketika mereka menutup browser mereka. Jadi jumlah waktu di mana file seperti itu di-cache biasanya tergantung pada:

  • Jumlah ruang cache yang telah dialokasikan browser
  • Jumlah situs web yang dikunjungi pengguna (dan ukuran situs tersebut)
  • Apakah pengguna telah menutup browser atau tidak
Stephen Ostermiller
sumber
Bisakah Anda jelaskan "lalu Firefox akan menyimpan sumber daya selama 1,5 hari." Dari tanggal mana, itu akan cache hingga 1,5 hari? Jika sudah 15 hari, maka sudah habis, bukan? Dan karena SEKARANG dikurangi modifikasi terakhir akan selamanya meningkat, maksud Anda, itu akan di-cache selamanya!
myDoggyWritesCode
1
Tidak selamanya. Untuk 1/10 waktu antara header yang dimodifikasi terakhir dan waktu pengunduhan. Jika sudah 15 hari untuk Anda itu bisa berarti sudah 150 hari sejak file terakhir diubah.
Stephen Ostermiller