Bagaimana kami mengontrol caching halaman web, di semua browser?

1552

Investigasi kami menunjukkan bahwa tidak semua browser menghargai arahan cache HTTP dengan cara yang seragam.

Demi alasan keamanan, kami tidak ingin halaman tertentu dalam aplikasi kami di-cache , oleh browser web. Ini harus berfungsi untuk setidaknya browser berikut:

  • Internet Explorer 6+
  • Firefox 1.5+
  • Safari 3+
  • Opera 9+
  • Chrome

Persyaratan kami berasal dari tes keamanan. Setelah keluar dari situs web kami, Anda dapat menekan tombol kembali dan melihat halaman yang di-cache.

Edward Wilde
sumber
Hanya untuk iPad Safari, Apakah [ini] [1] membantu? [1]: stackoverflow.com/questions/24524248/…
Bakhshi
Yang paling sederhana adalah menggunakan: max-age = 10. Ini tidak sempurna karena halaman akan di-cache selama 10 detik. Tapi itu solusi "header spaghetti" yang paling tidak di luar sana. Juga, ini kadang-kadang memberikan peningkatan kinerja besar pada situs web dinamis yang menggunakan proxy terbalik. (Skrip php lambat Anda akan dipanggil sekali setiap 10 detik dan kemudian akan di-cache oleh proksi terbalik. Sekali per 10 detik jauh lebih baik daripada sekali per pengunjung)
Hello World
3
Terima kasih atas pertanyaan bagus itu. Untuk rasa ingin tahu, apa yang mungkin menjadi situasi yang membuat Anda mengirim beberapa data sementara tidak ingin penerima menyimpannya karena "alasan keamanan" . Anda sudah mengirim mereka!
Akuntan م
1
@Accountant: dalam skenario-nya, pengguna telah logout. Siapa yang dapat menjamin bahwa pengguna manusia berikutnya pada Agen-Pengguna itu adalah orang yang baru saja keluar?
Fabien Haddadi

Jawaban:

2579

pengantar

Kumpulan header minimum yang benar yang bekerja di semua klien yang disebutkan (dan proksi):

Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0

Ini Cache-Controlsesuai dengan spesifikasi HTTP 1.1 untuk klien dan proksi (dan secara implisit diperlukan oleh beberapa klien di sebelah Expires). Ini Pragmasesuai dengan spesifikasi HTTP 1.0 untuk klien prasejarah. Ini Expiressesuai dengan spesifikasi HTTP 1.0 dan 1.1 untuk klien dan proksi. Di HTTP 1.1, yang Cache-Controldiutamakan Expires, jadi itu hanya untuk HTTP 1.0 proksi saja.

Jika Anda tidak peduli tentang IE6 dan caching yang rusak saat melayani halaman hanya dengan HTTPS no-store, maka Anda dapat menghilangkannya Cache-Control: no-cache.

Cache-Control: no-store, must-revalidate
Pragma: no-cache
Expires: 0

Jika Anda tidak peduli tentang klien IE6 atau HTTP 1.0 (HTTP 1.1 diperkenalkan 1997), maka Anda dapat menghilangkannya Pragma.

Cache-Control: no-store, must-revalidate
Expires: 0

Jika Anda tidak peduli tentang proksi HTTP 1.0, maka Anda dapat menghilangkannya Expires.

Cache-Control: no-store, must-revalidate

Di sisi lain, jika server secara otomatis menyertakan Datetajuk yang valid , maka Anda secara teoritis dapat menghilangkan Cache-Controldan Expireshanya mengandalkan .

Date: Wed, 24 Aug 2016 18:32:02 GMT
Expires: 0

Tapi itu mungkin gagal jika misalnya pengguna akhir memanipulasi tanggal sistem operasi dan perangkat lunak klien bergantung padanya.

Cache-ControlParameter lain seperti max-agetidak relevan jika Cache-Controlparameter yang disebutkan di atas ditentukan. The Last-Modifiedsundulan sebagai termasuk dalam sebagian besar jawaban yang lain di sini adalah hanya menarik jika Anda benar-benar ingin cache permintaan, sehingga Anda tidak perlu menentukan sama sekali.

Bagaimana cara mengaturnya?

Menggunakan PHP:

header("Cache-Control: no-cache, no-store, must-revalidate"); // HTTP 1.1.
header("Pragma: no-cache"); // HTTP 1.0.
header("Expires: 0"); // Proxies.

Menggunakan Java Servlet, atau Node.js:

response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
response.setHeader("Expires", "0"); // Proxies.

Menggunakan ASP.NET-MVC

Response.Cache.SetCacheability(HttpCacheability.NoCache);  // HTTP 1.1.
Response.Cache.AppendCacheExtension("no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
Response.AppendHeader("Expires", "0"); // Proxies.

Menggunakan ASP.NET Web API:

// `response` is an instance of System.Net.Http.HttpResponseMessage
response.Headers.CacheControl = new CacheControlHeaderValue
{
    NoCache = true,
    NoStore = true,
    MustRevalidate = true
};
response.Headers.Pragma.ParseAdd("no-cache");
// We can't use `response.Content.Headers.Expires` directly
// since it allows only `DateTimeOffset?` values.
response.Content?.Headers.TryAddWithoutValidation("Expires", 0.ToString()); 

Menggunakan ASP.NET:

Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
Response.AppendHeader("Expires", "0"); // Proxies.

Menggunakan ASP.NET Core v3

// using Microsoft.Net.Http.Headers
Response.Headers[HeaderNames.CacheControl] = "no-cache, no-store, must-revalidate";
Response.Headers[HeaderNames.Expires] = "0";
Response.Headers[HeaderNames.Pragma] = "no-cache";

Menggunakan ASP:

Response.addHeader "Cache-Control", "no-cache, no-store, must-revalidate" ' HTTP 1.1.
Response.addHeader "Pragma", "no-cache" ' HTTP 1.0.
Response.addHeader "Expires", "0" ' Proxies.

Menggunakan Ruby on Rails, atau Python / Flask:

headers["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
headers["Pragma"] = "no-cache" # HTTP 1.0.
headers["Expires"] = "0" # Proxies.

Menggunakan Python / Django:

response["Cache-Control"] = "no-cache, no-store, must-revalidate" # HTTP 1.1.
response["Pragma"] = "no-cache" # HTTP 1.0.
response["Expires"] = "0" # Proxies.

Menggunakan Python / Piramida:

request.response.headerlist.extend(
    (
        ('Cache-Control', 'no-cache, no-store, must-revalidate'),
        ('Pragma', 'no-cache'),
        ('Expires', '0')
    )
)

Menggunakan Go:

responseWriter.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate") // HTTP 1.1.
responseWriter.Header().Set("Pragma", "no-cache") // HTTP 1.0.
responseWriter.Header().Set("Expires", "0") // Proxies.

Menggunakan .htaccessfile Apache :

<IfModule mod_headers.c>
    Header set Cache-Control "no-cache, no-store, must-revalidate"
    Header set Pragma "no-cache"
    Header set Expires 0
</IfModule>

Menggunakan HTML4:

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">

Tag meta HTML vs header respons HTTP

Penting untuk diketahui adalah bahwa ketika sebuah halaman HTML dilayani melalui koneksi HTTP, dan header hadir dalam kedua header respon HTTP dan HTML <meta http-equiv>tag, maka salah satu yang ditentukan dalam header respon HTTP akan mendapatkan lebih diutamakan daripada HTML meta tag. Tag meta HTML hanya akan digunakan ketika halaman dilihat dari sistem file disk lokal melalui file://URL. Lihat juga W3 HTML spec bab 5.2.2 . Berhati-hatilah dengan ini ketika Anda tidak menentukannya secara pemrograman karena server web dapat menyertakan beberapa nilai default.

Secara umum, Anda sebaiknya tidak menentukan tag meta HTML untuk menghindari kebingungan oleh pemula dan mengandalkan header respons HTTP keras. Selain itu, secara khusus <meta http-equiv>tag - tag itu tidak valid dalam HTML5. Hanya http-equivnilai yang tercantum dalam spesifikasi HTML5 yang diizinkan.

Memverifikasi header respons HTTP yang sebenarnya

Untuk memverifikasi yang satu dan yang lain, Anda dapat melihat / men-debug mereka di monitor lalu lintas HTTP toolset pengembang webbrowser. Anda dapat mencapainya dengan menekan F12 di Chrome / Firefox23 + / IE9 +, dan kemudian membuka panel "Network" atau "Net", dan kemudian mengklik permintaan HTTP yang menarik untuk mengungkap semua detail tentang permintaan dan tanggapan HTTP. The bawah screenshot adalah dari Chrome:

Toolset pengembang Chrome monitor lalu lintas HTTP yang menampilkan header respons HTTP di stackoverflow.com

Saya juga ingin mengatur header itu pada unduhan file

Pertama-tama, pertanyaan dan jawaban ini ditargetkan pada "halaman web" (halaman HTML), bukan "unduhan file" (PDF, zip, Excel, dll). Anda sebaiknya menyimpannya dalam cache dan menggunakan beberapa pengenal versi file di suatu tempat di jalur URI atau querystring untuk memaksa pengunduhan ulang pada file yang diubah. Saat menerapkan tajuk tanpa-cache tersebut pada unduhan file, maka waspadalah terhadap bug IE7 / 8 saat menyajikan unduhan file melalui HTTPS alih-alih HTTP. Untuk detail, lihat IE tidak dapat mengunduh foo.jsf. IE tidak dapat membuka situs internet ini. Situs yang diminta tidak tersedia atau tidak dapat ditemukan .

BalusC
sumber
16
Tampaknya ini tidak lengkap. Saya mencoba solusi ini pada IE 8 dan menemukan bahwa browser akan memuat versi cache ketika Anda menekan tombol kembali.
Mike Ottum
16
Kemungkinan metodologi pengujian Anda salah. Mungkin halaman itu sudah ada di cache? Mungkin tajuknya salah / diganti? Mungkin Anda melihat permintaan yang salah? Dll ..
BalusC
8
Sebenarnya, saya mengkonfirmasi bahwa pendekatan ini tidak lengkap dan menyebabkan masalah dengan IE8, atau setidaknya dalam beberapa keadaan. Khususnya, ketika menggunakan IE8 untuk mengambil sumber daya melalui SSL, IE8 akan menolak untuk mengambil sumber daya untuk kedua kalinya (baik sama sekali, atau setelah percobaan pertama, tergantung pada tajuk yang digunakan). Lihat blog EricLaw , misalnya.
haylem
21
Saya ingin menambahkan bahwa inilah yang pada dasarnya dilakukan oleh Bank of America. Jika Anda melihat tajuk respons mereka dan menerjemahkannya ke dalam aspx, mereka melakukannya: Response.AppendHeader ("Cache-Control", "no-cache, no-store, must-validvalate"); Response.AppendHeader ("Kedaluwarsa", "Kam, 01 Des 1994 16:00:00 GMT"); Saya pikir, jika itu cukup baik untuk mereka, itu cukup baik untuk saya.
John
8
@ John: Header yang kedaluwarsa itu persis dengan nilai contoh dalam spesifikasi HTTP 1.0 . Ini bekerja, tetapi agak konyol untuk mengambil cap waktu persis seperti itu.
BalusC
244

(hei, semuanya: tolong jangan sembarangan menyalin & menempel semua header yang dapat Anda temukan)

Pertama-tama, riwayat tombol Kembali bukan cache :

Model kesegaran (Bagian 4.2) tidak selalu berlaku untuk mekanisme sejarah. Yaitu, mekanisme sejarah dapat menampilkan representasi sebelumnya bahkan jika telah kedaluwarsa.

Dalam spesifikasi HTTP lama, kata-katanya bahkan lebih kuat, secara eksplisit memberitahu browser untuk mengabaikan arahan cache untuk sejarah tombol kembali.

Kembali seharusnya kembali ke masa (waktu ketika pengguna sedang login). Itu tidak menavigasi ke depan ke URL yang sebelumnya dibuka.

Namun, dalam praktiknya, cache dapat memengaruhi tombol kembali, dalam keadaan yang sangat spesifik:

  • Halaman harus dikirim melalui HTTPS , jika tidak penghilang cache ini tidak dapat diandalkan. Plus, jika Anda tidak menggunakan HTTPS, maka halaman Anda rentan terhadap pencurian login dengan banyak cara lain.
  • Anda harus mengirim Cache-Control: no-store, must-revalidate(beberapa browser mengamati no-storedan beberapa mengamati must-revalidate)

Anda tidak perlu:

  • <meta>dengan header cache - tidak berfungsi sama sekali. Sama sekali tidak berguna.
  • post-check/ pre-check- Ini hanya direktif IE yang hanya berlaku untuk sumber daya yang dapat diakses .
  • Mengirim tajuk yang sama dua atau dua lusin bagian. Beberapa cuplikan PHP di luar sana benar-benar menggantikan tajuk sebelumnya, sehingga hanya yang terakhir dikirim.

Jika mau, Anda dapat menambahkan:

  • no-cacheatau max-age=0, yang akan membuat sumber daya (URL) "basi" dan memerlukan browser untuk memeriksa dengan server jika ada versi yang lebih baru ( no-storesudah menyiratkan ini lebih kuat).
  • Expiresdengan tanggal di masa lalu untuk HTTP / 1.0 klien (meskipun sebenarnya HTTP / 1.0-satunya klien benar-benar tidak ada hari ini).

Bonus: RFC caching HTTP baru .

Kornel
sumber
1
apakah ini akan memiliki efek samping pada kinerja situs web dalam hal waktu pemuatan? bagaimana no-store, no-cache, must-revalidate memengaruhi kinerja?
Raman Ghai
@RamanGhai Menonaktifkan cache umumnya merusak kinerja (dan ketiga opsi yang Anda sebutkan menonaktifkan cache). Ini dapat membuat proksi CDN dan ISP (mis. Yang umum digunakan oleh operator seluler) tidak efektif. Tidak ada salahnya memuat pertama oleh pengguna baru (selain dari masalah proxy), tetapi kemudian navigasi berikutnya mungkin jauh lebih lambat.
Kornel
@porneL Anda menyatakan bahwa kami harus mengirim Cache-Control: must-revalidate. Mengapa tidak mengirim Cache-Control: no-cachekarena no-cachesudah tersirat must-revalidate? w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1
Pacerier
3
@Pacerier, hubungan no-cachedengan must-revalidatebenar untuk cache, tetapi riwayat kembali bukan cache. Peramban kasus khusus eksplisit must-revalidateuntuk mengontrol perilaku riwayat .
Kornel
@porneL, Hmm apakah ada RFC pendukung yang menyatakan bahwa itu perilaku yang diinginkan?
Pacerier
103

Seperti yang dinyatakan @Kornel, yang Anda inginkan bukan untuk menonaktifkan cache, tetapi untuk menonaktifkan buffer sejarah. Browser yang berbeda memiliki caranya sendiri yang halus untuk menonaktifkan buffer riwayat.

Di Chrome (v28.0.1500.95 m) kita dapat melakukan ini hanya dengan Cache-Control: no-store.

Di FireFox (v23.0.1) salah satu dari ini akan berfungsi:

  1. Cache-Control: no-store

  2. Cache-Control: no-cache (hanya https)

  3. Pragma: no-cache (hanya https)

  4. Vary: * (hanya https)

Di Opera (v12.15) kita hanya dapat melakukannya dengan Cache-Control: must-revalidate(https saja).

Di Safari (v5.1.7, 7534.57.2) salah satu dari ini akan berfungsi:

  1. Cache-Control: no-store
    <body onunload=""> dalam html

  2. Cache-Control: no-store (hanya https)

Di IE8 (v8.0.6001.18702IC) salah satu dari ini akan berfungsi:

  1. Cache-Control: must-revalidate, max-age=0

  2. Cache-Control: no-cache

  3. Cache-Control: no-store

  4. Cache-Control: must-revalidate
    Expires: 0

  5. Cache-Control: must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT

  6. Pragma: no-cache (hanya https)

  7. Vary: * (hanya https)

Menggabungkan di atas memberi kami solusi ini yang berfungsi untuk Chrome 28, FireFox 23, IE8, Safari 5.1.7, dan Opera 12.15: Cache-Control: no-store, must-revalidate (hanya https)

Perhatikan bahwa https diperlukan karena Opera tidak akan menonaktifkan buffer riwayat untuk halaman http biasa. Jika Anda benar-benar tidak dapat memperoleh https dan Anda siap mengabaikan Opera, yang terbaik yang dapat Anda lakukan adalah ini:

Cache-Control: no-store
<body onunload="">

Di bawah ini menunjukkan log mentah dari pengujian saya:

HTTP:

  1. Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Gagal: Opera 12.15
    Sukses: Chrome 28, FireFox 23, IE8, Safari 5.1.7

  2. Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Gagal: Opera 12.15
    Sukses: Chrome 28, FireFox 23, IE8, Safari 5.1.7

  3. Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    Gagal: Safari 5.1.7, Opera 12.15
    Sukses: Chrome 28, FireFox 23, IE8

  4. Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    Gagal: Safari 5.1.7, Opera 12.15
    Sukses: Chrome 28, FireFox 23, IE8

  5. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Gagal: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Sukses: IE8

  6. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Gagal: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Sukses: IE8

  7. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Gagal: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Sukses: IE8

  8. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Gagal: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Sukses: IE8

  9. Cache-Control: no-store
    Gagal: Safari 5.1.7, Opera 12.15
    Sukses: Chrome 28, FireFox 23, IE8

  10. Cache-Control: no-store
    <body onunload="">
    Gagal: Opera 12.15
    Sukses: Chrome 28, FireFox 23, IE8, Safari 5.1.7

  11. Cache-Control: no-cache
    Gagal: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Sukses: IE8

  12. Vary: *
    Gagal: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Sukses: tidak ada

  13. Pragma: no-cache
    Gagal: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Sukses: tidak ada

  14. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Gagal: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Sukses: IE8

  15. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Gagal: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Sukses: IE8

  16. Cache-Control: must-revalidate, max-age=0
    Gagal: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Sukses: IE8

  17. Cache-Control: must-revalidate
    Expires: 0
    Gagal: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Sukses: IE8

  18. Cache-Control: must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Gagal: Chrome 28, FireFox 23, Safari 5.1.7, Opera 12.15
    Sukses: IE8

  19. Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Gagal: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Sukses: tidak ada

HTTPS:

  1. Cache-Control: private, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    <body onunload="">
    Gagal: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Sukses: tidak ada

  2. Cache-Control: private, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    <body onunload="">
    Gagal: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15
    Sukses: tidak ada

  3. Vary: *
    Gagal: Chrome 28, Safari 5.1.7, Opera 12.15
    Sukses: FireFox 23, IE8

  4. Pragma: no-cache
    Gagal: Chrome 28, Safari 5.1.7, Opera 12.15
    Sukses: FireFox 23, IE8

  5. Cache-Control: no-cache
    Gagal: Chrome 28, Safari 5.1.7, Opera 12.15
    Sukses: FireFox 23, IE8

  6. Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
    Gagal: Chrome 28, Safari 5.1.7, Opera 12.15
    Sukses: FireFox 23, IE8

  7. Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    Gagal: Chrome 28, Safari 5.1.7, Opera 12.15
    Sukses: FireFox 23, IE8

  8. Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    Gagal: Chrome 28, Safari 5.1.7, Opera 12.15
    Sukses: FireFox 23, IE8

  9. Cache-Control: must-revalidate
    Gagal: Chrome 28, FireFox 23, IE8, Safari 5.1.7
    Sukses: Opera 12.15

  10. Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
    <body onunload="">
    Gagal: Chrome 28, FireFox 23, IE8, Safari 5.1.7
    Sukses: Opera 12.15

  11. Cache-Control: must-revalidate, max-age=0
    Gagal: Chrome 28, FireFox 23, Safari 5.1.7
    Sukses: IE8, Opera 12.15

  12. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Gagal: Chrome 28, Safari 5.1.7
    Sukses: FireFox 23, IE8, Opera 12.15

  13. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Gagal: Chrome 28, Safari 5.1.7
    Sukses: FireFox 23, IE8, Opera 12.15

  14. Cache-Control: no-store
    Gagal: Opera 12.15
    Sukses: Chrome 28, FireFox 23, IE8, Safari 5.1.7

  15. Cache-Control: private, no-cache, no-store, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Gagal: Opera 12.15
    Sukses: Chrome 28, FireFox 23, IE8, Safari 5.1.7

  16. Cache-Control: private, no-cache, no-store, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    <body onunload="">
    Gagal: Opera 12.15
    Sukses: Chrome 28, FireFox 23, IE8, Safari 5.1.7

  17. Cache-Control: private, no-cache
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    Gagal: Chrome 28, Safari 5.1.7, Opera 12.15
    Sukses: FireFox 23, IE8

  18. Cache-Control: must-revalidate
    Expires: 0
    Gagal: Chrome 28, FireFox 23, Safari 5.1.7,
    Sukses: IE8, Opera 12.15

  19. Cache-Control: must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Gagal: Chrome 28, FireFox 23, Safari 5.1.7,
    Sukses: IE8, Opera 12.15

  20. Cache-Control: private, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    <body onunload="">
    Gagal: Chrome 28, FireFox 23, Safari 5.1.7,
    Sukses: IE8, Opera 12.15

  21. Cache-Control: private, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    <body onunload="">
    Gagal: Chrome 28, FireFox 23, Safari 5.1.7,
    Sukses: IE8, Opera 12.15

  22. Cache-Control: private, must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    Gagal: Chrome 28, Safari 5.1.7
    Sukses: FireFox 23, IE8, Opera 12.15

  23. Cache-Control: no-store, must-revalidate
    Gagal: tidak ada
    Sukses: Chrome 28, FireFox 23, IE8, Safari 5.1.7, Opera 12.15

Pacerier
sumber
3
Saya tahu ini diposting beberapa tahun yang lalu tapi itu bacaan yang menarik. Masalah ini telah membuatku gila selama beberapa bulan sekarang, tubuh tampaknya benar-benar tahu cara menangani kontrol cache. Saya telah melihat beberapa orang menggunakan <body onunload="">tetapi tampaknya lebih seperti cara mengatasi masalah yang sebenarnya. Saya sudah mencoba menggunakan .htaccess dan memodifikasi header dengan cara itu, jika saya menggunakan HTTPS, apakah seharusnya berfungsi seperti itu? Ini terutama safari di mana masalah paling banyak muncul.
Jordan
4
@ Jordan, Per log di atas jika Anda memiliki HTTPS kemudian menambahkan Cache-Control: no-storeakan melakukan trik. <body onunload="">hanya diperlukan ketika Anda tidak memiliki HTTPS.
Pacerier
37

Saya menemukan rute web.config berguna (mencoba menambahkannya ke jawaban tetapi tampaknya tidak diterima sehingga memposting di sini)

<configuration>
<system.webServer>
    <httpProtocol>
        <customHeaders>
            <add name="Cache-Control" value="no-cache, no-store, must-revalidate" />
            <!-- HTTP 1.1. -->
            <add name="Pragma" value="no-cache" />
            <!-- HTTP 1.0. -->
            <add name="Expires" value="0" />
            <!-- Proxies. -->
        </customHeaders>
    </httpProtocol>
</system.webServer>

Dan di sini adalah cara express / node.js untuk melakukan hal yang sama:

app.use(function(req, res, next) {
    res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate');
    res.setHeader('Pragma', 'no-cache');
    res.setHeader('Expires', '0');
    next();
});
Joseph Connolly
sumber
Untuk web.config saya akan memodifikasi sedikit untuk menerapkan header khusus hanya untuk skrip yang kita tahu dimuat secara dinamis / menggunakan needsejs. Dengan asumsi skrip Anda ditemukan di folder klien: <location path = "client"> ..... </lokasi>
Ibrahim ben Salah
Untuk yang mungkin bertanya-tanya apa web.confitu: Ini adalah pengaturan utama dan file konfigurasi untuk ASP.NETaplikasi web. Ini adalah dokumen XML yang berada di direktori root. ( wiki ).
lain
27

Saya menemukan bahwa semua jawaban di halaman ini masih memiliki masalah. Secara khusus, saya perhatikan bahwa tidak ada dari mereka yang akan menghentikan IE8 dari menggunakan versi cache halaman ketika Anda mengaksesnya dengan menekan tombol kembali.

Setelah banyak penelitian dan pengujian, saya menemukan bahwa hanya dua header yang benar-benar saya butuhkan adalah:

Cache-Control: no-store
Bervariasi: *

Untuk penjelasan tentang header Vary, periksa http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.6

Pada IE6-8, FF1.5-3.5, Chrome 2-3, Safari 4, dan Opera 9-10, tajuk ini menyebabkan halaman diminta dari server ketika Anda mengklik tautan ke halaman, atau meletakkan URL langsung di bilah alamat. Itu mencakup sekitar 99% dari semua browser yang digunakan pada Januari '10.

Pada IE6, dan Opera 9-10, menekan tombol kembali masih menyebabkan versi yang di-cache dimuat. Di semua browser lain yang saya uji, mereka mengambil versi baru dari server. Sejauh ini, saya belum menemukan set header yang akan menyebabkan browser tersebut tidak mengembalikan versi halaman yang di-cache ketika Anda menekan tombol kembali.

Pembaruan: Setelah menulis jawaban ini, saya menyadari bahwa server web kami mengidentifikasi dirinya sebagai server HTTP 1.0. Header yang saya daftarkan adalah yang benar agar respons dari server HTTP 1.0 tidak di-cache oleh browser. Untuk server HTTP 1.1, lihat jawaban BalusC .

Chris Vasselli
sumber
4
Ini berfungsi untuk tombol kembali IE8 !! Setelah mencoba segala sesuatu di setiap saran lainnya, menambahkan header "Vary: *" tampaknya satu-satunya yang dapat memaksa IE8 untuk memuat ulang halaman ketika pengguna menekan tombol kembali. Dan ini tidak bekerja pada HTTP / 1.1 server.
coredumperror
Dikombinasikan dengan tajuk yang disarankan oleh BarlusC, ditambah potongan JS yang memanggil window.location.reload () ketika acara onPageShow memicu dengan atribut "persisten" (diperlukan untuk Safari), setiap browser yang saya uji berhasil memaksa memuat ulang dari server ketika pengguna menggunakan tombol Kembali.
coredumperror
1
@CoreDumpError, oh Anda seharusnya tidak menganggap JavaScript diaktifkan.
Pacerier
@Pacerier Pada saat saya menulis jawabannya pada 2010, ini bekerja pada versi Safari dan Opera terbaru, dengan server kami mengidentifikasi dirinya sebagai server HTTP 1.0. Sayangnya, saya tidak memiliki cara untuk dengan mudah menguji ini lagi, jadi saya tidak bisa mengatakan sesuatu yang pasti tentang versi terbaru dari browser ini.
Chris Vasselli
Dengan versi browser apa Anda diuji?
Pacerier
21

Setelah sedikit riset, kami menemukan daftar tajuk berikut yang tampaknya mencakup sebagian besar peramban:

Di ASP.NET kami menambahkan ini menggunakan cuplikan berikut:

Response.ClearHeaders(); 
Response.AppendHeader("Cache-Control", "no-cache"); //HTTP 1.1
Response.AppendHeader("Cache-Control", "private"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "no-store"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "must-revalidate"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "max-stale=0"); // HTTP 1.1 
Response.AppendHeader("Cache-Control", "post-check=0"); // HTTP 1.1 
Response.AppendHeader("Cache-Control", "pre-check=0"); // HTTP 1.1 
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0 
Response.AppendHeader("Expires", "Mon, 26 Jul 1997 05:00:00 GMT"); // HTTP 1.0 

Ditemukan dari: http://forums.asp.net/t/1013531.aspx

Edward Wilde
sumber
36
@ Bart: Yang lebih merepotkan lagi adalah tanggal 26 Juli 1997 adalah hari Sabtu, bukan hari Senin ...
C
5
Cache-Control: no-cachedan Cache-Control: privatebentrok - Anda seharusnya tidak pernah bersama-sama: yang pertama memberi tahu browser dan proksi untuk tidak melakukan cache sama sekali, yang terakhir memberi tahu proxy untuk tidak melakukan cache tetapi membiarkan browser menyimpan salinan pribadi mereka sendiri. Saya tidak yakin pengaturan browser mana yang akan diikuti, tetapi sepertinya tidak konsisten antara browser dan versi.
Keith
Jangan gunakan pra-cek dan pasca-cek. blogs.msdn.com/b/ieinternals/archive/2009/07/20/...
EricLaw
ini tidak berhasil untuk saya - menggunakan asp.net 4.5 kode berjalan tetapi tidak menghasilkan hasil yang diperlukan. Saya harus mengikuti ini: stackoverflow.com/questions/22443932/…
Andy
8

Penggunaan tajuk pragma dalam respons adalah kisah istri. RFC2616 hanya mendefinisikannya sebagai header permintaan

http://www.mnot.net/cache_docs/#PRAGMA

Dave Cheney
sumber
4
Ini adalah contoh bagus mengapa Anda harus melampaui spesifikasi. Jika spesifikasi selalu jernih, tidak akan ada banyak gunanya untuk situs seperti StackOverflow. Dari Microsoft Untuk tujuan kompatibilitas mundur dengan server HTTP 1.0, Internet Explorer mendukung penggunaan khusus HTTP Pragma: header tanpa cache. Jika klien berkomunikasi dengan server melalui koneksi aman (https: //) dan server mengembalikan Pragma: no-cache header dengan respons, Internet Explorer tidak men-cache respon.
michaelok
@michaelok: Referensi Anda valid, tetapi melewatkan poin yang lebih besar - Tetapkan Kontrol-Cache yang tepat / Kedaluwarsa dan Anda tidak perlu pragma.
EricLaw
8

PENOLAKAN: Saya sangat menyarankan membaca jawaban @ BalusC. Setelah membaca tutorial caching berikut: http://www.mnot.net/cache_docs/ (Saya sarankan Anda membacanya juga), saya yakin itu benar. Namun, karena alasan historis (dan karena saya telah mengujinya sendiri), saya akan memasukkan jawaban asli saya di bawah:


Saya mencoba jawaban 'diterima' untuk PHP, yang tidak berhasil untuk saya. Lalu saya melakukan sedikit riset, menemukan sedikit varian, mengujinya, dan berhasil. Ini dia:

header('Cache-Control: no-store, private, no-cache, must-revalidate');     // HTTP/1.1
header('Cache-Control: pre-check=0, post-check=0, max-age=0, max-stale = 0', false);  // HTTP/1.1
header('Pragma: public');
header('Expires: Sat, 26 Jul 1997 05:00:00 GMT');                  // Date in the past  
header('Expires: 0', false); 
header('Last-Modified: '.gmdate('D, d M Y H:i:s') . ' GMT');
header ('Pragma: no-cache');

Itu seharusnya bekerja. Masalahnya adalah ketika mengatur bagian yang sama dari header dua kali, jika falsetidak dikirim sebagai argumen kedua ke fungsi header, fungsi header hanya akan menimpa header()panggilan sebelumnya . Jadi, ketika mengatur Cache-Control, misalnya jika seseorang tidak ingin meletakkan semua argumen dalam satu header()panggilan fungsi, ia harus melakukan sesuatu seperti ini:

header('Cache-Control: this');
header('Cache-Control: and, this', false);

Lihat dokumentasi yang lebih lengkap di sini .

Steven Oxley
sumber
14
Ini penuh dengan mitos. pra-cek dan pasca-cek hanya untuk IE, hanya relevan untuk respons yang di-cache, dan nilai 0 adalah no-op. max-stale adalah header permintaan proxy, bukan header respons server. Kedaluwarsa hanya menerima nilai tunggal. Lebih dari satu akan menyebabkan tajuk ini diabaikan.
Kornel
1
@porneL, akankah Anda mengirimkan jawaban bersaing yang berhubungan dengan mitos-mitos ini dengan benar?
Oddthinking
@Oddinkink, sepertinya stackoverflow.com/questions/49547/… adalah jawaban yang bersaing.
Mike Ottum
@Pacerier ya, seperti yang saya katakan di disclaimer, gunakan jawaban BalusC.
Steven Oxley
8

Untuk ASP.NET Core, buat kelas middleware sederhana:

public class NoCacheMiddleware
{
    private readonly RequestDelegate m_next;

    public NoCacheMiddleware( RequestDelegate next )
    {
        m_next = next;
    }

    public async Task Invoke( HttpContext httpContext )
    {
        httpContext.Response.OnStarting( ( state ) =>
        {
            // ref: http://stackoverflow.com/questions/49547/making-sure-a-web-page-is-not-cached-across-all-browsers
            httpContext.Response.Headers.Append( "Cache-Control", "no-cache, no-store, must-revalidate" );
            httpContext.Response.Headers.Append( "Pragma", "no-cache" );
            httpContext.Response.Headers.Append( "Expires", "0" );
            return Task.FromResult( 0 );
        }, null );

        await m_next.Invoke( httpContext );
    }
}

kemudian daftarkan dengan Startup.cs

app.UseMiddleware<NoCacheMiddleware>();

Pastikan Anda menambahkan ini di suatu tempat setelah

app.UseStaticFiles();
kspearrin
sumber
Saya akan menyarankan untuk menggunakan konstanta dari Microsoft.Net.Http.Headers.HeaderNames alih-alih string literal "Kontrol-Cache", "Pragma" dan "Kedaluwarsa".
Victor Sharovatov
7

Arahan ini tidak mengurangi risiko keamanan apa pun. Mereka benar-benar dimaksudkan untuk memaksa UA untuk menyegarkan informasi yang mudah menguap, bukan mencegah UA mempertahankan informasi. Lihat pertanyaan serupa ini . Paling tidak, tidak ada jaminan bahwa router, proxy, dll. Tidak akan mengabaikan arahan caching juga.

Pada catatan yang lebih positif, kebijakan mengenai akses fisik ke komputer, instalasi perangkat lunak, dan sejenisnya akan menempatkan Anda jauh di depan kebanyakan perusahaan dalam hal keamanan. Jika konsumen informasi ini adalah anggota masyarakat, satu-satunya hal yang dapat Anda lakukan adalah membantu mereka memahami bahwa begitu informasi mengenai mesin mereka, mesin itu adalah tanggung jawab mereka , bukan milik Anda.

Tukang sampah
sumber
7

Ada bug di IE6

Konten dengan "Content-Encoding: gzip" selalu di-cache bahkan jika Anda menggunakan "Cache-Control: no-cache".

http://support.microsoft.com/kb/321722

Anda dapat menonaktifkan kompresi gzip untuk pengguna IE6 (periksa agen pengguna untuk "MSIE 6")

Edson Medina
sumber
6

RFC untuk HTTP 1.1 mengatakan metode yang tepat adalah menambahkan HTTP Header untuk:

Kontrol-Cache: tanpa-cache

Browser yang lebih lama dapat mengabaikan ini jika mereka tidak memenuhi HTTP 1.1. Untuk itu Anda dapat mencoba tajuk:

Pragma: tanpa cache

Ini juga seharusnya berfungsi untuk browser HTTP 1.1.

Chris Dail
sumber
1
Spesifikasi menunjukkan bahwa respons tidak boleh digunakan kembali tanpa validasi ulang. Ini adalah Kontrol-Cache: no-store yang merupakan metode resmi untuk menunjukkan bahwa respons bahkan tidak disimpan dalam cache di tempat pertama.
AnthonyWJones
6

Mengatur header http yang dimodifikasi ke tanggal tertentu pada 1995 biasanya berhasil.

Ini sebuah contoh:

Kedaluwarsa: Rab, 15 Nov 1995 04:58:08 GMT
Terakhir Diubah: Rabu, 15 Nov 1995 04:58:08 GMT
Cache-Control: no-cache, harus divalidasi ulang
Anders Sandvig
sumber
1
Menyetel Last-Modified lama tidak berdampak pada caching, selain membiarkan respons cache digunakan lebih lama karena revalidasi heuristik.
EricLaw
6

The dokumentasi PHP untuk header fungsi memiliki contoh yang agak lengkap (disumbangkan oleh pihak ketiga):

    header('Pragma: public');
    header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");                  // Date in the past   
    header('Last-Modified: '.gmdate('D, d M Y H:i:s') . ' GMT');
    header('Cache-Control: no-store, no-cache, must-revalidate');     // HTTP/1.1
    header('Cache-Control: pre-check=0, post-check=0, max-age=0', false);    // HTTP/1.1
    header ("Pragma: no-cache");
    header("Expires: 0", false);
Grey Panther
sumber
11
Ini jelas salah. Panggilan kedua ke tajuk () untuk Kedaluwarsa, kontrol Cache, dan Pragma sepenuhnya menimpa nilai yang ditetapkan sebelumnya.
Kornel
1
@porneL: Tidak, jangan menimpa nilai yang ditetapkan sebelumnya saat ia memberikan false sebagai parameter ke-2, mengatakan untuk tidak menimpa nilai sebelumnya.
Julien Palard
1
@JulienPalard jawabannya telah diedit setelah saya berkomentar. Itu masih tidak masuk akal.
Kornel
Jangan mengirim beberapa header Kontrol-Cache jika Anda ingin bekerja di IE sebelum 9. Jangan pernah mengirim pra-cek atau pasca-cek. blogs.msdn.com/b/ieinternals/archive/2009/07/20/...
EricLaw
6

Jika Anda menghadapi masalah unduhan dengan IE6-IE8 melalui SSL dan cache: header no-cache (dan nilai-nilai serupa) dengan file MS Office Anda dapat menggunakan cache: private, no-store header dan mengembalikan file berdasarkan permintaan POST. Berhasil.

Albert
sumber
6

dalam kasus saya, saya memperbaiki masalah di chrome dengan ini

<form id="form1" runat="server" autocomplete="off">

di mana saya perlu menghapus konten data formulir previus ketika pengguna mengklik tombol kembali untuk alasan keamanan

pengguna2321638
sumber
Masalah peramban mozilla 19.x saya juga teratasi oleh cuplikan kode. autocomplete = "off". Terima kasih.
Satya
5

Jawaban yang diterima tampaknya tidak berfungsi untuk IIS7 +, menjawab banyak pertanyaan tentang header cache yang tidak dikirim di II7:

Dan seterusnya

Jawaban yang diterima benar di mana header harus ditetapkan, tetapi tidak dalam bagaimana mereka harus ditetapkan. Cara ini bekerja dengan IIS7:

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.AppendCacheExtension("no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache");
Response.AppendHeader("Expires", "-1");

Baris pertama diset Cache-controlke no-cache, dan baris kedua menambahkan atribut lainnyano-store, must-revalidate

JK.
sumber
Ini bekerja untuk saya:Response.Cache.SetAllowResponseInBrowserHistory(false); Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.Cache.SetNoStore(); Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
Vilx-
4

Saya mendapatkan hasil terbaik dan paling konsisten di semua browser dengan mengatur Pragma: tanpa-cache

petr k.
sumber
4

Header dalam jawaban yang diberikan oleh BalusC tidak mencegah Safari 5 (dan mungkin versi yang lebih lama juga) menampilkan konten dari cache browser saat menggunakan tombol kembali browser. Cara untuk mencegah hal ini adalah dengan menambahkan atribut event handler onunload yang kosong ke tag body:

<body onunload=""> 

Peretasan ini rupanya memecah cache penerusan mundur di Safari: Apakah ada peristiwa lintas-browser yang memuat ketika mengeklik tombol kembali?

Tobias
sumber
Keren, saya sudah mengujinya dan ini benar-benar berfungsi pada Safari (5.1.7) tetapi tidak Opera.
Pacerier
4

Selain itu, hanya untuk ukuran yang baik, pastikan Anda mereset ExpiresDefaultdi .htaccessfile Anda jika Anda menggunakannya untuk mengaktifkan caching.

ExpiresDefault "access plus 0 seconds"

Setelah itu, Anda dapat menggunakan ExpiresByTypeuntuk menetapkan nilai spesifik untuk file yang ingin Anda cache:

ExpiresByType image/x-icon "access plus 3 month"

Ini juga mungkin berguna jika file dinamis Anda misalnya php, dll. Sedang di-cache oleh browser, dan Anda tidak dapat menemukan alasannya. Periksa ExpiresDefault.

Bukit Obinwanne
sumber
3

Selain tajuk, pertimbangkan untuk melayani halaman Anda melalui https . Banyak browser tidak akan melakukan cache https secara default.

Harry
sumber
3
//In .net MVC
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public ActionResult FareListInfo(long id)
{
}

// In .net webform
<%@ OutputCache NoStore="true" Duration="0" VaryByParam="*" %>
yongfa365
sumber
2

Untuk menyelesaikan BalusC -> JAWABAN Jika Anda menggunakan perl Anda dapat menggunakan CGI untuk menambahkan header HTTP.

Menggunakan Perl:

Use CGI;    
sub set_new_query() {
        binmode STDOUT, ":utf8";
        die if defined $query;
        $query = CGI->new();
        print $query->header(
                        -expires       => 'Sat, 26 Jul 1997 05:00:00 GMT',
                        -Pragma        => 'no-cache',
                        -Cache_Control => join(', ', qw(
                                            private
                                            no-cache
                                            no-store
                                            must-revalidate
                                            max-age=0
                                            pre-check=0
                                            post-check=0 
                                           ))
        );
    }

Menggunakan apache httpd.conf

<FilesMatch "\.(html|htm|js|css|pl)$">
FileETag None
<ifModule mod_headers.c>
Header unset ETag
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
</ifModule>

Catatan: Ketika saya mencoba menggunakan html META, browser mengabaikannya dan membuat cache halaman.

Carlos Escalera Alonso
sumber
0

Saya hanya ingin menunjukkan bahwa jika seseorang ingin mencegah caching konten yang HANYA dinamis, menambahkan header tambahan itu harus dibuat secara terprogram.

Saya mengedit file konfigurasi proyek saya untuk menambahkan header no-cache, tetapi itu juga menonaktifkan caching konten statis, yang biasanya tidak diinginkan. Memodifikasi header respons dalam kode memastikan bahwa gambar dan file gaya akan di-cache.

Ini cukup jelas, namun masih layak disebut.

Dan satu lagi peringatan. Hati-hati menggunakan metode ClearHeaders dari kelas HttpResponse. Ini mungkin memberi Anda beberapa memar jika Anda menggunakannya secara sembrono. Seperti itu memberi saya.

Setelah mengarahkan kembali ke acara ActionFilterAttribute konsekuensi dari menghapus semua header kehilangan semua data sesi dan data dalam penyimpanan TempData. Lebih aman untuk mengalihkan dari Tindakan atau tidak menghapus tajuk saat pengalihan dilakukan.

Setelah dipikir-pikir saya mencegah semua orang untuk menggunakan metode ClearHeaders. Lebih baik menghapus header secara terpisah. Dan untuk mengatur header Cache-Control dengan benar saya menggunakan kode ini:

filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
filterContext.HttpContext.Response.Cache.AppendCacheExtension("no-store, must-revalidate");
pengguna3253726
sumber
0

Saya tidak beruntung dengan <head><meta>elemen. Menambahkan parameter terkait cache HTTP secara langsung (di luar dokumen HTML) memang berfungsi untuk saya.

Kode contoh dalam Python menggunakan web.headerpanggilan web.py berikut. Saya sengaja menghapus kode utilitas pribadi saya yang tidak relevan.

    impor web
    impor sys
    mengimpor PRIBADI-UTILITAS

    myname = "main.py"

    url = (
        '/', 'main_class'
    )

    main = web.aplikasi (url, globals ())

    render = web.template.render ("templates /", base = "layout", cache = False)

    kelas main_class (objek):
        def GET (diri sendiri):
            web.header ("Cache-control", "no-cache, no-store, must-revalidate")
            web.header ("Pragma", "no-cache")
            web.header ("Kedaluwarsa", "0")
            return render.main_form ()

        def POST (mandiri):
            msg = "POSTed:"
            form = web.input (fungsi = Tidak Ada)
            web.header ("Cache-control", "no-cache, no-store, must-revalidate")
            web.header ("Pragma", "no-cache")
            web.header ("Kedaluwarsa", "0")
            return render.index_laid_out (ucapan = msg + form.fungsi)

    if __name__ == "__main__":
        nargs = len (sys.argv)
        # Pastikan ada cukup argumen setelah nama program python
        jika nargs! = 2:
            LOG-AND-DIE ("% s: Galat baris perintah, nargs =% s, harus 2", namaku, narg)
        # Pastikan nomor port TCP adalah angka
        mencoba:
            tcp_port = int (sys.argv [1])
        kecuali Pengecualian sebagai e:
            LOG-AND-DIE ("% s: tcp_port = int (% s) gagal (bukan bilangan bulat)", nama saya, sys.argv [1])
        # Semuanya baik-baik saja!
        JUST-LOG ("% s: Berjalan di port% d", nama saya, tcp_port)
        web.httpserver.runsimple (main.wsgifunc (), ("localhost", tcp_port))
        main.run ()

Richard Elkins
sumber
Apakah ini sudah dibahas berkali-kali dalam jawaban yang telah ada di situs selama bertahun-tahun?
Martin Tournoij
Arahan META bekerja di Internet Explorer dan versi Edge 18 dan sebelumnya. Browser modern tidak mendukungnya. crbug.com/2763
EricLaw
0

Lihat tautan ini ke Studi Kasus tentang Caching:

http://securityevaluators.com/knowledge/case_studies/caching/

Ringkasan, menurut artikel itu, hanya Cache-Control: no-storeberfungsi di Chrome, Firefox dan IE. IE menerima kontrol lain, tetapi Chrome dan Firefox tidak. Tautan ini merupakan bacaan yang baik lengkap dengan sejarah caching dan dokumentasi bukti konsep.

Paul
sumber
0

Tidak yakin apakah jawaban saya terdengar sederhana dan bodoh, dan mungkin sudah diketahui Anda sejak lama, tetapi karena mencegah seseorang menggunakan tombol kembali browser untuk melihat halaman bersejarah Anda adalah salah satu tujuan Anda, Anda dapat menggunakan:

window.location.replace("https://www.example.com/page-not-to-be-viewed-in-browser-history-back-button.html");

Tentu saja, ini mungkin tidak dapat diterapkan di seluruh situs, tetapi setidaknya untuk beberapa halaman penting, Anda dapat melakukannya. Semoga ini membantu.

Antonio Ooi
sumber
-1

Anda dapat menggunakan blok lokasi untuk mengatur file individual alih-alih seluruh aplikasi mendapatkan caching di IIS

 <location path="index.html">
    <system.webServer>
      <httpProtocol>
        <customHeaders>
          <add name="Cache-Control" value="no-cache" />
        </customHeaders>
      </httpProtocol>
    </system.webServer>
  </location>
CodeMind
sumber