Apa perbedaan antara Kontrol-Cache: max-age = 0 dan no-cache?

Jawaban:

598

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-Controltajuk. 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").


Saat dikirim oleh server asal

Saya percaya max-age=0hanya memberi tahu cache (dan agen pengguna) responsnya sudah basi sejak awal dan karenanya mereka HARUS memvalidasi kembali respons (mis. Dengan If-Not-Modifiedheader) sebelum menggunakan salinan yang di-cache, sedangkan, no-cachememberi 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 Warningheader), tetapi no-cachemengatakan 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-cachetidak 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-revalidatepada 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-cacheuntuk melakukan hal yang sama seperti no-store(mis. Tidak ada caching apa pun)?


Saat dikirim oleh agen pengguna

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-Modifiedheader) 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.

Michael Krebs
sumber
9
Tidakkah Kontrol-Cache: max-age = 0, harus-divalidasi ulang, proxy-revalidate akan menjadi ekuivalen tepat tanpa-cache?
Didier A.
1
Jawaban yang bagus, saya pergi untuk membaca artikel situs Anda tetapi halaman tidak lagi valid. palisade.plynt.com/issues/2008Jul/cache-control-attributes
Craig London
7
Terima kasih, @CraigLondon. Saya mengalihkannya ke versi cache.
Michael Krebs
2
must-revalidateTIDAK dimaksudkan sama dengan no-cacheatau 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.
Patanjali
3
@Patanjali 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.
Franklin Yu
57

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.

Gunnar Cheng
sumber
31
Ini salah. shift-refresh adalah penyegaran keras yang lebih mirip denganno-store
Michael
3
Diverifikasi di Firefox 45.0 yang, seperti Chrome 49.0.2623.87 m, juga mengirimkan "Pragma: no-cache" ketika Shift + Refreshing.
Cees Timmerman
34

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 .

El Yobo
sumber
4
Demikian pula, IE 8 menjalankan semua jenis masalah "tidak bisa mengunduh" ketika tidak ada cache digunakan di https. resolusi yang disarankan kadang-kadang mencakup mengubah tajuk ke max-age = 0
Robert Christ
28

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-cacherespons dengan semantik yang sama dengan max-age=0,must-revalidate. Firefox 3.5, bagaimanapun, tampaknya memperlakukan no-cachesebagai setara dengan no-store, yang menyebalkan untuk kinerja dan penggunaan bandwidth.

Squid Cache, secara default, tampaknya tidak pernah menyimpan apa pun dengan no-cacheheader, seperti Firefox.

Saran saya adalah mengatur public,max-age=0sumber 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-cachesepenuhnya, 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=0atau no-cachesecara acak tergantung pada sumber daya.

rmalayter
sumber
2
Jawaban terbaik untuk konten yang dilindungi kata sandi. private,max-age=0.
dana
21
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 :)

shahkalpesh
sumber
12

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=0bisa 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-cachetidak mau .

Hank Gay
sumber
Poin bagus, tetapi dalam praktiknya, apakah ada browser yang melakukannya?
Pacerier
3
@Pacerier Saya pikir ini lebih untuk caching server proxy seperti Varnish, Squid, Traffic, dll.
Hank Gay
12

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.

Lizardx
sumber
css dan js adalah kandidat yang cocok untuk caching, seperti dalam sistem produksi, mereka seharusnya tidak terlalu sering berubah. Namun, memiliki caching untuk mereka saat berkembang adalah hal yang menyebalkan, karena aktivitas tersebut dapat sering membutuhkan cache-flush yang dipaksakan. Tetapi, jika seseorang tidak dapat menggunakan pengaturan yang berbeda untuk lingkungan yang berbeda, persyaratan produksi harus didahulukan, karena memiliki efek paling besar karena jumlah akses yang jauh lebih besar akan menghemat bandwidth, dibandingkan dengan beberapa penyegaran Ctrl-F5 yang baru yang dimiliki oleh beberapa pengembang. melakukan. Namun, meminta data waktu nyata mengharuskan kontrol cache berfungsi dengan benar.
Patanjali
0

Satu hal yang (secara mengejutkan) belum disebutkan adalah bahwa permintaan dapat secara eksplisit menunjukkan bahwa ia akan menerima data basi, menggunakan max-stalearahan. 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-cacheyang benar-benar mengabulkan setiap permintaan oleh klien (dengan max-stale) untuk data basi, sebagai cache HARUS memvalidasi ulang.

Ethan
sumber
-2

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.

Dukungan HttpWatch
sumber
9
Sejauh yang saya mengerti, 'no-cache' TIDAK seharusnya mencegah penyimpanan ('no-store' adalah cara yang tepat untuk mencapainya). Apakah browser tertentu mengartikan 'no-cache' sebagai 'no-store'? Itu akan menjelaskan mengapa 'max-age = 0' digunakan sebagai pengganti hanya 'no-cache'
rubyruy
3
Ini salah. Lihat di atas. Beberapa browser / server dapat memilih untuk menerapkan no-cache sebagai no-store, tetapi tidak semua.
Jeremy Kauffman
4
Satu-satunya cara yang aman adalah menggunakan max-age=0jika maksud Anda caching diperbolehkan tetapi sumber daya harus divalidasi ulang dan no-storejika Anda tidak ingin respons disimpan dalam cache sama sekali. Secara no-cacheacak ditunjuk untuk berarti salah satu dari ini tergantung pada vendor agen pengguna dan nomor versi dan protokol transfer.
Mikko Rantalainen
Kapan Firefox menggunakan no-store?
Cees Timmerman