Mengapa browser tidak menghargai header cache untuk permintaan halaman awal?

8

Aku menggaruk kepalaku sedikit tentang ini. Situs Drupal yang saya jalankan sedang mengatur header cache yang sesuai yang harus mengindikasikan bahwa halaman tersebut dapat di-cache selama 15 menit. Namun, setiap kali saya menekan halaman itu selalu mengirimkan permintaan GET daripada memuat halaman dari cache.

Saya tidak secara paksa me-refresh halaman setiap kali, yang saya asumsikan akan menunjukkan ke browser saya ingin menghapus cache. Saya tidak mengaktifkan penghilang cache mode pengembang.

Apakah ini hanya perilaku default browser, atau apakah saya melewatkan sesuatu yang jelas? Inilah header permintaan / respons dari memukul beranda saya dari alat dev FireFox:

CATATAN / EDIT : Beberapa orang menyarankan ini terkait dengan Expirestajuk yang ada di masa lalu. Namun Cache-Controlmengabaikan apa pun di Expires, seperti yang dijelaskan dalam RFC 2616 , Bagian 14.9.3. Drupal menyertakan ini untuk menonaktifkan caching pada klien HTTP 1.0 yang lebih lama, yang tidak mendukung Varytajuk yang lebih canggih yang diperlukan Drupal untuk caching yang tepat.

masukkan deskripsi gambar di sini

Brian
sumber

Jawaban:

11

Anda memiliki header Vary: Cookie, Accept-Encoding dalam respons. Itu berarti bahwa jika proksi (termasuk browser Anda) ingin me-cache halaman ini, ia harus siap untuk men-cache versi baru untuk setiap vlaue cookie yang mungkin dimodifikasi (atau perubahan dalam pengkodean penerimaan). Terutama, itu harus menyimpan catatan di tempat pertama cookie ketika mereka dikirim dalam permintaan sebagai kriteria yang membedakan. Saya dapat membayangkan bahwa salah satu browser menyangkal ini jika cookie terlalu besar (dan karenanya tidak mungkin diulang), atau ia menolak untuk menghindari informasi cookie yang bocor melalui konten cache, atau hanya konten cookie diubah pada setiap panggilan.

Hagen von Eitzen
sumber
4
Apakah HANYA akan menjawab pertanyaan saya sendiri ketika saya sampai pada kesimpulan ini juga. Saya memiliki cookie Google Analytics, salah satunya berubah pada setiap permintaan halaman, mencegah halaman dari di-cache.
Brian
2

Dalam program CMS beberapa halaman memerlukan interaksi dengan database untuk menampilkan konten dinamis khusus untuk permintaan pengguna. Seluruh halaman tidak bisa di-cache atau tidak akan menampilkan konten yang benar kepada pengguna.

Contoh dari hal ini dalam praktiknya adalah halaman keranjang belanja / checkout eCommerce. Karena halaman terlihat berbeda setiap kali tidak ada cara untuk men-cache sepenuhnya. Tanpa mengetahui lebih lanjut tentang halaman spesifik, sulit untuk mengetahui apakah halaman yang Anda rujuk memerlukan keterlibatan basis data.

JMC
sumber
Meskipun itu benar, itu tidak berlaku untuk mekanisme caching halaman Drupal (secara harfiah cache seluruh output HTML dan mengirimkannya untuk lalu lintas "anonim") dan tidak benar-benar terkait dengan pertanyaan saya. Pertanyaan saya adalah tentang bagaimana browser tampaknya bereaksi tidak benar terhadap header cache halaman yang sesuai yang ditetapkan (lihat gambar).
Brian
Saya telah melihat ini sebelumnya selama debugging, tetapi tidak ingat, apakah ada alasan yang valid tajuk respons Anda menunjukkan Kedaluwarsa: Nov 1978? Atau itu mungkin jawaban Anda.
JMC
1
Dalam kode Drupal, komentar di atas tajuk itu berbunyi: "proksi HTTP / 1.0 tidak mendukung tajuk Bervariasi, jadi cegah caching apa pun dengan mengirimkan tanggal Kedaluwarsa di masa lalu. Klien HTTP / 1.1 mengabaikan tajuk Kedaluwarsa jika Kontrol Cache: max-age = direktif telah ditentukan (lihat RFC 2616, bagian 14.9.3). " Tanggal khusus adalah pencipta ulang tahun Drupal.
Brian
Masih aneh bahwa Kedaluwarsa tidak cocok mis. Last-modified plus max-age
Hagen von Eitzen
-1

Selain jawaban lain, Expirestajuk sudah ada di masa lalu, itu juga merupakan salah satu alasan browser tidak akan melakukan cache halaman.

Tero Kilkanen
sumber
Ini tidak benar ketika ada Cache-Controltajuk. Itu menimpa Expirestajuk untuk klien HTTP 1.1. Lihat ietf.org/rfc/rfc2616.txt , bagian 14.9.3.
Brian