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-Control
sesuai dengan spesifikasi HTTP 1.1 untuk klien dan proksi (dan secara implisit diperlukan oleh beberapa klien di sebelah Expires
). Ini Pragma
sesuai dengan spesifikasi HTTP 1.0 untuk klien prasejarah. Ini Expires
sesuai dengan spesifikasi HTTP 1.0 dan 1.1 untuk klien dan proksi. Di HTTP 1.1, yang Cache-Control
diutamakan 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 Date
tajuk yang valid , maka Anda secara teoritis dapat menghilangkan Cache-Control
dan Expires
hanya 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-Control
Parameter lain seperti max-age
tidak relevan jika Cache-Control
parameter yang disebutkan di atas ditentukan. The Last-Modified
sundulan 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 .htaccess
file 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-equiv
nilai 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:
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 .