Jawaban:
Saya memiliki pertanyaan yang sama, dan menemukan beberapa info dalam pencarian saya (pertanyaan Anda muncul sebagai salah satu hasil). Inilah yang saya ditentukan ...
Ada dua sisi pada Cache-Control
tajuk. Satu sisi adalah di mana ia dapat dikirim oleh server web (alias. "Server asal"). Sisi lain adalah di mana ia dapat dikirim oleh browser (alias. "Agen pengguna").
Saya percaya max-age=0
hanya memberi tahu cache (dan agen pengguna) responsnya sudah basi sejak awal dan karenanya mereka HARUS memvalidasi kembali respons (mis. Dengan If-Not-Modified
header) sebelum menggunakan salinan yang di-cache, sedangkan, no-cache
memberi tahu mereka bahwa mereka HARUS memvalidasi ulang sebelum menggunakan cache. salinan. Dari 14.9.1 Apa itu Cacheable :
tanpa cache
... cache TIDAK HARUS menggunakan respons untuk memenuhi permintaan berikutnya tanpa validasi ulang dengan server asal. Ini memungkinkan server asal untuk mencegah caching bahkan oleh cache yang telah dikonfigurasi untuk mengembalikan respons basi ke permintaan klien.
Dengan kata lain, cache kadang-kadang dapat memilih untuk menggunakan respons basi (meskipun saya yakin mereka harus menambahkan Warning
header), tetapi no-cache
mengatakan bahwa cache tidak diperbolehkan menggunakan respons basi, apa pun yang terjadi. Mungkin Anda ingin perilaku REAL-validasi HARUS ketika statistik bisbol dihasilkan dalam halaman, tetapi Anda ingin perilaku HARUS -revalidasi ketika Anda menghasilkan respons terhadap pembelian e-commerce.
Meskipun Anda benar dalam komentar Anda ketika Anda mengatakan no-cache
tidak seharusnya mencegah penyimpanan, sebenarnya mungkin ada perbedaan lain saat menggunakan no-cache
. Saya menemukan sebuah halaman, Cache Control Directive Demystified , yang mengatakan (Saya tidak dapat menjamin kebenarannya):
Dalam praktiknya, IE dan Firefox sudah mulai memperlakukan direktif tanpa-cache seolah-olah itu memerintahkan browser untuk tidak melakukan cache halaman. Kami mulai mengamati perilaku ini sekitar setahun yang lalu. Kami menduga bahwa perubahan ini dipicu oleh penggunaan direktif ini secara luas (dan salah) untuk mencegah caching.
...
Perhatikan bahwa akhir-akhir ini, "cache-control: no-cache" juga sudah mulai berperilaku seperti arahan "no-store".
Sebagai tambahan, tampaknya bagi saya bahwa Cache-Control: max-age=0, must-revalidate
pada dasarnya harus berarti hal yang sama Cache-Control: no-cache
. Jadi mungkin itu cara untuk mendapatkan perilaku HARUS -validasi no-cache
, sambil menghindari migrasi yang jelas no-cache
untuk melakukan hal yang sama seperti no-store
(mis. Tidak ada caching apa pun)?
Saya percaya jawaban shahkalpesh berlaku untuk sisi agen pengguna. Anda juga dapat melihat 13.2.6 Disambiguasi Banyak Respons .
Jika agen pengguna mengirim permintaan dengan Cache-Control: max-age=0
(alias. "Validasi ujung-ke-ujung"), maka setiap cache di sepanjang jalan akan memvalidasi ulang entri cache-nya (mis. Dengan If-Not-Modified
header) sampai ke server asal. Jika jawabannya adalah 304 (Tidak Dimodifikasi), entitas yang di-cache dapat digunakan.
Di sisi lain, mengirim permintaan dengan Cache-Control: no-cache
(alias. "Reload end-to-end") tidak memvalidasi ulang dan server TIDAK HARUS menggunakan salinan yang di-cache ketika merespons.
must-revalidate
TIDAK dimaksudkan sama dengan no-cache
atau no-store
. Cache bypass yang terakhir sama sekali, tetapi yang pertama hanya mengatakan bahwa cache harus selalu diperiksa untuk kesegaran, tetapi jika masih lancar, ini dapat digunakan, sehingga menghemat bandwidth. Yang terakhir memaksa pengunduhan penuh ujung ke ujung sepanjang waktu, mengambil bandwidth yang tidak perlu dan menunda tanggapan.
no-cache
tidak "mem-bypass cache sama sekali" atau "memaksa unduhan penuh end-to-end sepanjang waktu", setidaknya tidak di semua browser. Spesifikasinya hanya mengatakan bahwa browser harus memvalidasi cache.
usia maks = 0
Ini sama dengan mengklik Refresh , yang berarti, beri saya salinan terbaru kecuali saya sudah memiliki salinan terbaru.
tanpa cache
Ini menahan Shift sembari mengklik Refresh, yang artinya, ulangi saja apa pun yang terjadi.
no-store
Pertanyaan lama sekarang, tetapi jika orang lain menemukan ini melalui pencarian seperti yang saya lakukan, tampaknya IE9 akan menggunakan ini untuk mengkonfigurasi perilaku sumber daya saat menggunakan tombol kembali dan maju. Ketika max-age = 0 digunakan, browser akan menggunakan versi terakhir saat melihat sumber daya di tekan maju / mundur. Jika tidak ada cache digunakan, sumber daya akan diambil ulang.
Rincian lebih lanjut tentang caching IE9 dapat dilihat pada posting blog caching msdn ini .
Dalam pengujian saya baru-baru ini dengan IE8 dan Firefox 3.5, tampaknya keduanya kompatibel dengan RFC. Namun, mereka berbeda dalam "keramahan" mereka ke server asal. IE8 memperlakukan no-cache
respons dengan semantik yang sama dengan max-age=0,must-revalidate
. Firefox 3.5, bagaimanapun, tampaknya memperlakukan no-cache
sebagai setara dengan no-store
, yang menyebalkan untuk kinerja dan penggunaan bandwidth.
Squid Cache, secara default, tampaknya tidak pernah menyimpan apa pun dengan no-cache
header, seperti Firefox.
Saran saya adalah mengatur public,max-age=0
sumber daya non-sensitif yang Anda ingin memeriksa kesegaran pada setiap permintaan, tetapi masih memungkinkan kinerja dan manfaat bandwidth caching. Untuk item per pengguna dengan pertimbangan yang sama, gunakan private,max-age=0
.
Saya akan menghindari penggunaan no-cache
sepenuhnya, karena tampaknya telah dibastardisasi oleh beberapa browser dan cache populer dengan fungsional yang setara no-store
.
Selain itu, jangan meniru Akamai dan Limelight. Sementara mereka pada dasarnya menjalankan array caching besar-besaran sebagai bisnis utama mereka, dan harus menjadi ahli, mereka sebenarnya memiliki kepentingan dalam menyebabkan lebih banyak data diunduh dari jaringan mereka. Google mungkin juga bukan pilihan yang baik untuk dicontoh. Mereka tampaknya menggunakan max-age=0
atau no-cache
secara acak tergantung pada sumber daya.
private,max-age=0
.
usia maks Ketika cache perantara dipaksa, dengan menggunakan arahan max-age = 0, untuk memvalidasi ulang entri cache sendiri, dan klien telah menyediakan validatornya sendiri dalam permintaan, the validator yang diberikan mungkin berbeda dari validator yang saat ini disimpan dengan entri cache. Dalam hal ini, cache MUNGKIN menggunakan validator mana pun dalam membuat permintaannya sendiri tanpa mempengaruhi transparansi semantik. Namun, pilihan validator dapat memengaruhi kinerja. Pendekatan terbaik adalah untuk cache perantara untuk menggunakan validatornya sendiri saat mengajukan permintaan. Jika server membalas dengan 304 (Tidak Dimodifikasi), maka cache dapat mengembalikan salinan yang sekarang divalidasi ke klien dengan respons 200 (OK). Jika server membalas dengan validator entitas dan cache yang baru, namun, cache perantara dapat membandingkan validator yang dikembalikan dengan yang disediakan di permintaan klien, menggunakan fungsi perbandingan yang kuat. Jika validator klien adalah sama dengan server asal, maka cache perantara hanya mengembalikan 304 (Tidak Diubah). Jika tidak, ia mengembalikan entitas baru dengan respons 200 (OK). Jika permintaan menyertakan arahan no-cache, itu TIDAK HARUS menyertakan min-fresh, maks-basi, atau maks-usia.
Courtesy: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.4
Jangan terima ini sebagai jawaban - saya harus membacanya untuk memahami penggunaannya yang sebenarnya :)
Saya bukan ahli caching, tapi Mark Nottingham. Ini dokumen caching- nya . Ia juga memiliki tautan yang sangat baik di bagian Referensi.
Berdasarkan bacaan saya tentang dokumen-dokumen itu, sepertinya max-age=0
bisa memungkinkan cache untuk mengirim tanggapan cache ke permintaan yang datang pada "waktu yang sama" di mana "waktu yang sama" berarti cukup dekat bersama-sama mereka terlihat simultan ke cache, tetapi no-cache
tidak mau .
Ngomong-ngomong, perlu dicatat bahwa beberapa perangkat seluler, terutama produk Apple seperti iPhone / iPad benar-benar mengabaikan tajuk seperti tidak ada cache, tidak ada toko, Kedaluwarsa: 0, atau apa pun yang Anda coba paksakan agar tidak digunakan kembali kedaluwarsa halaman formulir.
Hal ini menyebabkan kami sakit kepala tanpa akhir ketika kami mencoba untuk mendapatkan masalah dari iPad pengguna yang mengatakan, tertidur di halaman yang telah mereka capai melalui proses formulir, katakan langkah 2 dari 3, dan kemudian perangkat benar-benar mengabaikan toko / arahan cache, dan sejauh yang saya tahu, cukup mengambil snapshot virtual halaman dari keadaan terakhirnya, yaitu mengabaikan apa yang dikatakan secara eksplisit, dan, tidak hanya itu, mengambil halaman yang tidak boleh disimpan , dan menyimpannya tanpa benar-benar memeriksanya lagi, yang mengarah ke semua jenis masalah Sesi aneh, antara lain.
Saya hanya menambahkan ini kalau-kalau ada yang datang dan tidak tahu mengapa mereka mendapatkan kesalahan sesi dengan khususnya iPhone dan iPad, yang tampaknya merupakan pelanggar terburuk di bidang ini.
Saya telah melakukan pengujian debugger yang cukup luas dengan masalah ini, dan ini adalah kesimpulan saya, perangkat mengabaikan arahan ini sepenuhnya.
Bahkan dalam penggunaan reguler, saya telah menemukan bahwa beberapa ponsel juga benar-benar gagal untuk memeriksa versi baru melalui katakanlah, Kedaluwarsa: 0 kemudian memeriksa tanggal terakhir yang dimodifikasi untuk menentukan apakah harus mendapatkan yang baru.
Itu tidak terjadi, jadi apa yang terpaksa saya lakukan adalah menambahkan string kueri ke file css / js yang saya butuhkan untuk memaksa pembaruan, yang mengelabui perangkat seluler yang bodoh untuk berpikir itu adalah file yang tidak dimilikinya, seperti: my .css? v = 1, lalu v = 2 untuk pembaruan css / js. Ini sebagian besar bekerja.
Selain itu, peramban pengguna juga dibiarkan bawaan, sejak 2016, seperti yang saya temukan terus-menerus (kami melakukan BANYAK perubahan dan pembaruan ke situs kami) juga gagal memeriksa tanggal terakhir yang dimodifikasi pada file tersebut, tetapi kueri metode string memperbaiki masalah itu. Ini adalah sesuatu yang saya perhatikan dengan klien dan orang-orang kantor yang cenderung menggunakan default pengguna normal dasar pada browser mereka, dan tidak memiliki kesadaran tentang masalah caching dengan css / js dll, hampir selalu gagal untuk mendapatkan css / js baru pada perubahan, yang berarti default untuk browser mereka, sebagian besar MSIE / Firefox, tidak melakukan apa yang diperintahkan, mereka mengabaikan perubahan dan mengabaikan tanggal modifikasi terakhir dan tidak memvalidasi, bahkan dengan Kadaluwarsa: 0 atur secara eksplisit.
Ini adalah utas yang bagus dengan banyak informasi teknis yang baik, tetapi juga penting untuk dicatat betapa buruknya dukungan untuk hal ini pada perangkat seluler. Setiap beberapa bulan saya harus menambahkan lebih banyak lapisan perlindungan terhadap kegagalan mereka untuk mengikuti perintah-perintah tajuk yang mereka terima, atau untuk secara tepat mem-interpet perintah-perintah itu.
Satu hal yang (secara mengejutkan) belum disebutkan adalah bahwa permintaan dapat secara eksplisit menunjukkan bahwa ia akan menerima data basi, menggunakan max-stale
arahan. Dalam hal itu, jika server merespons max-age=0
, cache hanya akan mempertimbangkan respons basi, dan akan bebas menggunakannya untuk memenuhi permintaan klien [yang meminta data yang berpotensi basi]. Sebaliknya, jika server mengirim no-cache
yang benar-benar mengabulkan setiap permintaan oleh klien (dengan max-stale
) untuk data basi, sebagai cache HARUS memvalidasi ulang.
Perbedaannya adalah bahwa tanpa cache (tidak menyimpan di Firefox) mencegah segala jenis caching. Itu dapat berguna untuk mencegah halaman dengan konten yang aman ditulis ke disk dan untuk halaman yang harus selalu diperbarui bahkan jika mereka dikunjungi kembali dengan tombol kembali.
max-age = 0 menunjukkan bahwa entri cache sudah usang dan memerlukan validasi ulang, tetapi tidak mencegah caching. Seringkali browser hanya memvalidasi sumber daya satu kali per sesi browser, sehingga konten mungkin tidak diperbarui sampai situs dikunjungi dalam sesi baru.
Biasanya, browser tidak akan menghapus entri cache yang kadaluwarsa, kecuali jika mereka mengklaim kembali ruang untuk konten yang lebih baru ketika cache browser penuh. Menggunakan no-store, no-cache memungkinkan entri cache dihapus secara eksplisit.
max-age=0
jika maksud Anda caching diperbolehkan tetapi sumber daya harus divalidasi ulang dan no-store
jika Anda tidak ingin respons disimpan dalam cache sama sekali. Secara no-cache
acak ditunjuk untuk berarti salah satu dari ini tergantung pada vendor agen pengguna dan nomor versi dan protokol transfer.