http सभी ब्राउज़रों में वेब पेज कैशिंग को कैसे नियंत्रित करें?




caching https (21)

हमारी जांच ने हमें दिखाया है कि सभी ब्राउज़र एक समान तरीके से http कैश निर्देशों का सम्मान नहीं करते हैं।

सुरक्षा कारणों से हम नहीं चाहते हैं कि हमारे ब्राउज़र में कुछ पेज वेब ब्राउज़र द्वारा कैश किए जाएं। यह कम से कम निम्न ब्राउज़रों के लिए काम करना चाहिए:

  • इंटरनेट एक्सप्लोरर 6+
  • फ़ायरफ़ॉक्स 1.5+
  • सफारी 3+
  • ओपेरा 9 +
  • क्रोम

हमारी आवश्यकता सुरक्षा परीक्षण से आई थी। हमारी वेबसाइट से लॉग आउट करने के बाद आप बैक बटन दबा सकते हैं और कैश किए गए पेज देख सकते हैं।


मैंने पाया कि इस पृष्ठ के सभी उत्तरों में अभी भी समस्याएं थीं। विशेष रूप से, मैंने देखा है कि उनमें से कोई भी पृष्ठ को कैश किए गए संस्करण का उपयोग करने से IE8 को रोक देगा जब आपने बैक बटन मारकर इसे एक्सेस किया था।

बहुत से शोध और परीक्षण के बाद, मैंने पाया कि केवल दो शीर्षकों की मुझे वास्तव में आवश्यकता थी:

कैश-कंट्रोल: नो-स्टोर
वेरी: *

वेरी हेडर की व्याख्या के लिए, http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.6

आईई 6-8, एफएफ 1.5-3.5, क्रोम 2-3, सफारी 4, और ओपेरा 9-10 पर, इन शीर्षकों ने पेज से लिंक पर क्लिक करते समय पृष्ठ से सर्वर से अनुरोध किया था, या यूआरएल डाला सीधे पता बार में। इसमें जनवरी 10 के रूप में उपयोग में आने वाले सभी ब्राउज़रों में से 99% शामिल हैं।

आईई 6, और ओपेरा 9-10 पर, बैक बटन पर टक्कर मारने से कैश किए गए संस्करण को लोड किया गया। मैंने परीक्षण किए गए सभी अन्य ब्राउज़रों पर, सर्वर से एक नया संस्करण प्राप्त किया। अब तक, मुझे हेडर का कोई भी सेट नहीं मिला है, जिससे आप ब्राउज़र को बैक बटन दबाते समय पृष्ठों के कैश किए गए संस्करणों को वापस नहीं कर पाएंगे।

अद्यतन: इस उत्तर को लिखने के बाद, मुझे एहसास हुआ कि हमारा वेब सर्वर स्वयं को HTTP 1.0 सर्वर के रूप में पहचान रहा है। मैंने जो शीर्षलेख सूचीबद्ध किए हैं, वे HTTP 1.0 सर्वर से प्रतिक्रियाओं के लिए ब्राउज़र द्वारा कैश किए जाने के लिए सही हैं। HTTP 1.1 सर्वर के लिए, बलुस के answer


स्वीकार किए गए उत्तर IIS7 + के लिए काम नहीं करते हैं, कैश हेडर के बारे में बड़ी संख्या में प्रश्नों से जाकर II7 में नहीं भेजा जा रहा है:

  • कुछ कैश-नियंत्रण रखने के लिए प्रतिक्रियाओं को मजबूर कर रहा है: आईआईएस 7 में निजी
  • आईआईएस 7: कैश सेटिंग काम नहीं कर रहा है ... क्यों?
  • आईआईएस 7 + एएसपी.नेट एमवीसी क्लाइंट कैशिंग हेडर काम नहीं कर रहे हैं
  • एएसपीएक्स पृष्ठों के लिए कैश-नियंत्रण सेट करें
  • कैश-कंट्रोल: आईआईएस 7 + एएसपी.नेट एमवीसी में क्लाइंट ब्राउजर को नो-स्टोर, रीडायडिडेट नहीं भेजा जाना चाहिए

और इसी तरह

स्वीकार्य उत्तर सही है जिसमें शीर्षलेख सेट किए जाने चाहिए, लेकिन यह नहीं कि उन्हें कैसे सेट किया जाना चाहिए। इस तरह आईआईएस 7 के साथ काम करता है:

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

पहली पंक्ति Cache-control को Cache-control पर सेट करती है, और दूसरी पंक्ति अन्य विशेषताएँ no-store, must-revalidate जोड़ती है no-store, must-revalidate


प्रतिक्रिया में प्रगति शीर्षलेख का उपयोग एक पत्नियों की कहानी है। आरएफसी 2616 केवल इसे अनुरोध हेडर के रूप में परिभाषित करता है

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


Also, just for good measure, make sure you reset the ExpiresDefault in your .htaccess file if you're using that to enable caching.

ExpiresDefault "access plus 0 seconds"

Afterwards, you can use ExpiresByType to set specific values for the files you want to cache:

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

This may also come in handy if your dynamic files eg php, etc. are being cached by the browser, and you can't figure out why. Check ExpiresDefault .


हेडर फ़ंक्शन के लिए PHP दस्तावेज़ों का एक पूर्ण उदाहरण है (किसी तृतीय पक्ष द्वारा योगदान):

    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);

HTTP 1.1 के लिए आरएफसी का कहना है कि HTTP विधि को जोड़ने के लिए उचित विधि है:

कैश-कंट्रोल: नो-कैश

पुराने ब्राउज़र इसे अनदेखा कर सकते हैं अगर वे HTTP 1.1 के ठीक से अनुपालन नहीं कर रहे हैं। उन लोगों के लिए आप हेडर को आजमा सकते हैं:

प्रगमा: नो-कैश

यह HTTP 1.1 ब्राउज़र के लिए भी काम करना चाहिए।


परिचय

सभी निर्दिष्ट ग्राहकों (और प्रॉक्सी) में काम करने वाले शीर्षकों का सही न्यूनतम सेट:

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

Cache-Control क्लाइंट और प्रॉक्सी के लिए HTTP 1.1 spec प्रति है (और Expires बगल में कुछ ग्राहकों द्वारा निहित रूप से आवश्यक)। Pragma प्रागैतिहासिक ग्राहकों के लिए HTTP 1.0 spec प्रति है। Expires HTTP 1.0 और 1.1 spec प्रति क्लाइंट और प्रॉक्सी के लिए है। HTTP 1.1 में, Cache-Control को Expires पर प्राथमिकता होती है, इसलिए यह केवल HTTP 1.0 प्रॉक्सी के लिए ही है।

यदि आपको केवल 6 no-store साथ HTTPS पर पृष्ठों की सेवा करते समय आईई 6 और इसकी टूटी हुई कैशिंग की परवाह नहीं है, तो आप Cache-Control: no-cache छोड़ सकते हैं।

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

यदि आपको आईई 6 और न ही HTTP 1.0 क्लाइंट्स (HTTP 1.1 को 1 99 7 में पेश किया गया था) की परवाह नहीं है, तो आप Pragma को छोड़ सकते हैं।

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

यदि आपको HTTP 1.0 प्रॉक्सी के बारे में परवाह नहीं है, तो आप Expires हो सकते हैं।

Cache-Control: no-store, must-revalidate

दूसरी तरफ, यदि सर्वर में एक वैध Date शीर्षलेख शामिल होता है, तो आप सैद्धांतिक रूप से Cache-Control भी छोड़ सकते हैं और केवल Expires पर भरोसा कर सकते हैं।

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

लेकिन यह असफल हो सकता है अगर उदाहरण के लिए एंडुसर ऑपरेटिंग सिस्टम की तारीख में हेरफेर करता है और क्लाइंट सॉफ़्टवेयर उस पर भरोसा कर रहा है।

उपरोक्त Cache-Control पैरामीटर निर्दिष्ट किए जाने पर अन्य Cache-Control पैरामीटर जैसे max-age अप्रासंगिक हैं। यहां तक ​​कि अधिकांश अन्य उत्तरों में शामिल Last-Modified शीर्षलेख केवल तभी दिलचस्प है जब आप वास्तव में अनुरोध को कैश करना चाहते हैं, इसलिए आपको इसे निर्दिष्ट करने की आवश्यकता नहीं है।

इसे कैसे सेट करें?

PHP का उपयोग करना:

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

जावा सर्वलेट, या 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.

एएसपी.नेट-एमवीसी का उपयोग करना

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.

एएसपी.नेट का उपयोग करना:

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.

एएसपी का उपयोग करना:

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.

रेल, या पायथन / फ्लास्क पर रूबी का उपयोग करना:

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

पायथन / Django का उपयोग करना:

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

पायथन / पिरामिड का उपयोग करना:

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

Google 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.

Apache .htaccess फ़ाइल का उपयोग करना:

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

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" />

एचटीएमएल मेटा टैग बनाम HTTP प्रतिक्रिया शीर्षलेख

जानना महत्वपूर्ण है कि जब एक HTTP पृष्ठ पर एक HTML पृष्ठ परोसा जाता है, और एक हेडर HTTP प्रतिक्रिया शीर्षलेख और HTML <meta http-equiv> टैग दोनों में मौजूद होता है, तो HTTP प्रतिक्रिया शीर्षलेख में निर्दिष्ट एक को प्राथमिकता प्राप्त होगी एचटीएमएल मेटा टैग पर। HTML मेटा टैग का उपयोग तभी किया जाएगा जब पेज को स्थानीय डिस्क फ़ाइल सिस्टम से file:// URL के माध्यम से देखा जा सके। W3 HTML spec अध्याय 5.2.2 भी देखें। जब आप उन्हें प्रोग्रामेटिक रूप से निर्दिष्ट नहीं करते हैं तो इसका ख्याल रखें, क्योंकि वेबसर्वर कुछ डिफ़ॉल्ट मानों को शामिल कर सकता है।

आम तौर पर, आप स्टार्टर्स द्वारा भ्रम से बचने के लिए एचटीएमएल मेटा टैग निर्दिष्ट नहीं करेंगे , और हार्ड HTTP प्रतिक्रिया शीर्षकों पर भरोसा करेंगे। इसके अलावा, विशेष रूप से उन <meta http-equiv> टैग HTML5 में अमान्य हैं। एचटीएमएल 5 विनिर्देशों में सूचीबद्ध केवल http-equiv मानों की अनुमति है।

वास्तविक HTTP प्रतिक्रिया शीर्षलेख की पुष्टि

एक और दूसरे को सत्यापित करने के लिए, आप वेबब्रोसर के डेवलपर टूलसेट के HTTP ट्रैफ़िक मॉनीटर में उन्हें देख / डिबग कर सकते हैं। आप Chrome / Firefox23 + / IE9 + में F12 दबाकर और फिर "नेटवर्क" या "नेट" टैब पैनल खोलकर और फिर HTTP अनुरोध और प्रतिक्रिया के बारे में सभी विवरणों को उजागर करने के लिए ब्याज के HTTP अनुरोध पर क्लिक करके वहां जा सकते हैं। नीचे स्क्रीनशॉट क्रोम से है:

मैं उन शीर्षकों को फ़ाइल डाउनलोड पर भी सेट करना चाहता हूं

सबसे पहले, यह प्रश्न और उत्तर "वेब पेज" (एचटीएमएल पेज) पर लक्षित है, न कि "फ़ाइल डाउनलोड" (पीडीएफ, ज़िप, एक्सेल, आदि)। आप उन्हें बेहतर तरीके से कैश कर सकते हैं और यूआरआई पथ या क्वेरीस्ट्रिंग में कहीं भी कुछ फ़ाइल संस्करण पहचानकर्ता का उपयोग किसी बदले गए फ़ाइल पर पुनः लोड करने के लिए मजबूर कर सकते हैं। किसी भी तरह से फ़ाइल डाउनलोड पर उन नो-कैश हेडर को लागू करते समय, HTTP के बजाय HTTPS पर फ़ाइल डाउनलोड करने पर IE7 / 8 बग से सावधान रहें। विस्तार के लिए, देखें कि आईई foo.jsf डाउनलोड नहीं कर सकता है। आईई इस इंटरनेट साइट को खोलने में सक्षम नहीं था। अनुरोधित साइट या तो अनुपलब्ध है या नहीं मिल सकती है ।


जैसा कि पोर्नेल ने कहा है, आप जो चाहते हैं वह कैश को निष्क्रिय नहीं करना है, लेकिन इतिहास बफर को निष्क्रिय करना है। इतिहास बफर को अक्षम करने के लिए अलग-अलग ब्राउज़रों के अपने स्वयं के सूक्ष्म तरीके होते हैं।

क्रोम में (v28.0.1500.95 मीटर) हम इसे केवल Cache-Control: no-store द्वारा कर सकते हैं Cache-Control: no-store

फ़ायरफ़ॉक्स में (v23.0.1) इनमें से कोई भी काम करेगा:

  1. Cache-Control: no-store

  2. Cache-Control: no-cache (केवल https)

  3. Pragma: no-cache (केवल https)

  4. Vary: * (केवल https)

ओपेरा में (v12.15) हम केवल इसे Cache-Control: must-revalidate द्वारा कर सकते हैं Cache-Control: must-revalidate (केवल https)।

सफारी में (v5.1.7, 7534.57.2) इनमें से कोई भी काम करेगा:

  1. Cache-Control: no-store
    <body onunload=""> html में

  2. Cache-Control: no-store (केवल https)

आईई 8 (v8.0.6001.18702IC) में इनमें से कोई भी काम करेगा:

  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 (केवल https)

  7. Vary: * (केवल https)

उपर्युक्त संयोजन हमें यह समाधान देता है जो क्रोम 28, फ़ायरफ़ॉक्स 23, आईई 8, सफारी 5.1.7, और ओपेरा 12.15 के लिए काम करता है: Cache-Control: no-store, must-revalidate (केवल https)

ध्यान दें कि https की आवश्यकता है क्योंकि ओपेरा सादे http पृष्ठों के लिए इतिहास बफर को निष्क्रिय नहीं करेगा। यदि आप वास्तव में https प्राप्त नहीं कर सकते हैं और आप ओपेरा को अनदेखा करने के लिए तैयार हैं, तो आप यह कर सकते हैं कि यह सबसे अच्छा है:

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

नीचे मेरे परीक्षणों के कच्चे लॉग दिखाता है:

एचटीटीपी:

  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="">
    विफल: ओपेरा 12.15
    सफलता: क्रोम 28, फ़ायरफ़ॉक्स 23, आईई 8, सफारी 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="">
    विफल: ओपेरा 12.15
    सफलता: क्रोम 28, फ़ायरफ़ॉक्स 23, आईई 8, सफारी 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: *
    विफल: सफारी 5.1.7, ओपेरा 12.15
    सफलता: क्रोम 28, फ़ायरफ़ॉक्स 23, आईई 8

  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: *
    विफल: सफारी 5.1.7, ओपेरा 12.15
    सफलता: क्रोम 28, फ़ायरफ़ॉक्स 23, आईई 8

  5. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    विफल: क्रोम 28, फ़ायरफ़ॉक्स 23, सफारी 5.1.7, ओपेरा 12.15
    सफलता: आईई 8

  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="">
    विफल: क्रोम 28, फ़ायरफ़ॉक्स 23, सफारी 5.1.7, ओपेरा 12.15
    सफलता: आईई 8

  7. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    विफल: क्रोम 28, फ़ायरफ़ॉक्स 23, सफारी 5.1.7, ओपेरा 12.15
    सफलता: आईई 8

  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="">
    विफल: क्रोम 28, फ़ायरफ़ॉक्स 23, सफारी 5.1.7, ओपेरा 12.15
    सफलता: आईई 8

  9. Cache-Control: no-store
    विफल: सफारी 5.1.7, ओपेरा 12.15
    सफलता: क्रोम 28, फ़ायरफ़ॉक्स 23, आईई 8

  10. Cache-Control: no-store
    <body onunload="">
    विफल: ओपेरा 12.15
    सफलता: क्रोम 28, फ़ायरफ़ॉक्स 23, आईई 8, सफारी 5.1.7

  11. Cache-Control: no-cache
    विफल: क्रोम 28, फ़ायरफ़ॉक्स 23, सफारी 5.1.7, ओपेरा 12.15
    सफलता: आईई 8

  12. Vary: *
    विफल: क्रोम 28, फ़ायरफ़ॉक्स 23, आईई 8, सफारी 5.1.7, ओपेरा 12.15
    सफलता: कोई नहीं

  13. Pragma: no-cache
    विफल: क्रोम 28, फ़ायरफ़ॉक्स 23, आईई 8, सफारी 5.1.7, ओपेरा 12.15
    सफलता: कोई नहीं

  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="">
    विफल: क्रोम 28, फ़ायरफ़ॉक्स 23, सफारी 5.1.7, ओपेरा 12.15
    सफलता: आईई 8

  15. Cache-Control: private, no-cache, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    विफल: क्रोम 28, फ़ायरफ़ॉक्स 23, सफारी 5.1.7, ओपेरा 12.15
    सफलता: आईई 8

  16. Cache-Control: must-revalidate, max-age=0
    विफल: क्रोम 28, फ़ायरफ़ॉक्स 23, सफारी 5.1.7, ओपेरा 12.15
    सफलता: आईई 8

  17. Cache-Control: must-revalidate
    Expires: 0
    विफल: क्रोम 28, फ़ायरफ़ॉक्स 23, सफारी 5.1.7, ओपेरा 12.15
    सफलता: आईई 8

  18. Cache-Control: must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    विफल: क्रोम 28, फ़ायरफ़ॉक्स 23, सफारी 5.1.7, ओपेरा 12.15
    सफलता: आईई 8

  19. Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
    Pragma: no-cache
    Vary: *
    <body onunload="">
    विफल: क्रोम 28, फ़ायरफ़ॉक्स 23, आईई 8, सफारी 5.1.7, ओपेरा 12.15
    सफलता: कोई नहीं

HTTPS:

  1. Cache-Control: private, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    <body onunload="">
    विफल: क्रोम 28, फ़ायरफ़ॉक्स 23, आईई 8, सफारी 5.1.7, ओपेरा 12.15
    सफलता: कोई नहीं

  2. Cache-Control: private, max-age=0, proxy-revalidate, s-maxage=0
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    <body onunload="">
    विफल: क्रोम 28, फ़ायरफ़ॉक्स 23, आईई 8, सफारी 5.1.7, ओपेरा 12.15
    सफलता: कोई नहीं

  3. Vary: *
    विफल: क्रोम 28, सफारी 5.1.7, ओपेरा 12.15
    सफलता: फ़ायरफ़ॉक्स 23, आईई 8

  4. Pragma: no-cache
    विफल: क्रोम 28, सफारी 5.1.7, ओपेरा 12.15
    सफलता: फ़ायरफ़ॉक्स 23, आईई 8

  5. Cache-Control: no-cache
    विफल: क्रोम 28, सफारी 5.1.7, ओपेरा 12.15
    सफलता: फ़ायरफ़ॉक्स 23, आईई 8

  6. Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
    विफल: क्रोम 28, सफारी 5.1.7, ओपेरा 12.15
    सफलता: फ़ायरफ़ॉक्स 23, आईई 8

  7. Cache-Control: private, no-cache, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    Pragma: no-cache
    Vary: *
    विफल: क्रोम 28, सफारी 5.1.7, ओपेरा 12.15
    सफलता: फ़ायरफ़ॉक्स 23, आईई 8

  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: *
    विफल: क्रोम 28, सफारी 5.1.7, ओपेरा 12.15
    सफलता: फ़ायरफ़ॉक्स 23, आईई 8

  9. Cache-Control: must-revalidate
    विफल: क्रोम 28, फ़ायरफ़ॉक्स 23, आईई 8, सफारी 5.1.7
    सफलता: ओपेरा 12.15

  10. Cache-Control: private, must-revalidate, proxy-revalidate, s-maxage=0
    <body onunload="">
    विफल: क्रोम 28, फ़ायरफ़ॉक्स 23, आईई 8, सफारी 5.1.7
    सफलता: ओपेरा 12.15

  11. Cache-Control: must-revalidate, max-age=0
    विफल: क्रोम 28, फ़ायरफ़ॉक्स 23, सफारी 5.1.7
    सफलता: आईई 8, ओपेरा 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="">
    विफल: क्रोम 28, सफारी 5.1.7
    सफलता: फ़ायरफ़ॉक्स 23, आईई 8, ओपेरा 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="">
    विफल: क्रोम 28, सफारी 5.1.7
    सफलता: फ़ायरफ़ॉक्स 23, आईई 8, ओपेरा 12.15

  14. Cache-Control: no-store
    विफल: ओपेरा 12.15
    सफलता: क्रोम 28, फ़ायरफ़ॉक्स 23, आईई 8, सफारी 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="">
    विफल: ओपेरा 12.15
    सफलता: क्रोम 28, फ़ायरफ़ॉक्स 23, आईई 8, सफारी 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="">
    विफल: ओपेरा 12.15
    सफलता: क्रोम 28, फ़ायरफ़ॉक्स 23, आईई 8, सफारी 5.1.7

  17. Cache-Control: private, no-cache
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    विफल: क्रोम 28, सफारी 5.1.7, ओपेरा 12.15
    सफलता: फ़ायरफ़ॉक्स 23, आईई 8

  18. Cache-Control: must-revalidate
    Expires: 0
    विफल: क्रोम 28, फ़ायरफ़ॉक्स 23, सफारी 5.1.7,
    सफलता: आईई 8, ओपेरा 12.15

  19. Cache-Control: must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    विफल: क्रोम 28, फ़ायरफ़ॉक्स 23, सफारी 5.1.7,
    सफलता: आईई 8, ओपेरा 12.15

  20. Cache-Control: private, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
    Expires: 0
    <body onunload="">
    विफल: क्रोम 28, फ़ायरफ़ॉक्स 23, सफारी 5.1.7,
    सफलता: आईई 8, ओपेरा 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="">
    विफल: क्रोम 28, फ़ायरफ़ॉक्स 23, सफारी 5.1.7,
    सफलता: आईई 8, ओपेरा 12.15

  22. Cache-Control: private, must-revalidate
    Expires: Sat, 12 Oct 1991 05:00:00 GMT
    Pragma: no-cache
    Vary: *
    विफल: क्रोम 28, सफारी 5.1.7
    सफलता: फ़ायरफ़ॉक्स 23, आईई 8, ओपेरा 12.15

  23. Cache-Control: no-store, must-revalidate
    विफल: कोई नहीं
    सफलता: क्रोम 28, फ़ायरफ़ॉक्स 23, आईई 8, सफारी 5.1.7, ओपेरा 12.15


कुछ शोध के बाद हम शीर्षलेखों की निम्नलिखित सूची के साथ आए जो अधिकांश ब्राउज़रों को कवर करना प्रतीत होता था:

एएसपी.नेट में हमने निम्नलिखित स्निपेट का उपयोग करके इन्हें जोड़ा:

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 

से मिला: http://forums.asp.net/t/1013531.aspx


(हे, हर कोई: कृपया उन सभी शीर्षकों को कॉपी और पेस्ट न करें जिन्हें आप पा सकते हैं)

सबसे पहले, बैक बटन इतिहास कैश नहीं है :

ताजगी मॉडल (धारा 4.2) जरूरी नहीं है कि इतिहास तंत्र पर लागू हो। यही है, एक इतिहास तंत्र पिछले प्रस्तुति को प्रदर्शित कर सकता है भले ही यह समाप्त हो गया हो।

पुराने HTTP spec में शब्द भी मजबूत था, स्पष्ट रूप से ब्राउज़र को बैक बटन इतिहास के लिए कैश निर्देशों की उपेक्षा करने के लिए कह रहा था।

वापस समय पर वापस जाना चाहिए (उस समय जब उपयोगकर्ता लॉग इन था)। यह पहले खोले गए यूआरएल पर अग्रेषित नहीं करता है।

हालांकि, व्यावहारिक रूप से, कैश बैक बटन को बहुत विशिष्ट परिस्थितियों में प्रभावित कर सकता है:

  • पृष्ठ HTTPS पर वितरित किया जाना चाहिए, अन्यथा यह कैश-बस्टिंग विश्वसनीय नहीं होगा। इसके अलावा, यदि आप HTTPS का उपयोग नहीं कर रहे हैं, तो आपका पृष्ठ कई अन्य तरीकों से चोरी करने के लिए कमजोर है।
  • आपको Cache-Control: no-store, must-revalidate भेजना होगा Cache-Control: no-store, must-revalidate (कुछ ब्राउज़र no-store का निरीक्षण करते हैं और कुछ निरीक्षण must-revalidate )

आपको कभी भी इनमें से किसी की आवश्यकता नहीं है:

  • <meta> कैश हेडर के साथ - यह बिल्कुल काम नहीं करता है। पूरी तरह से बेकार।
  • post-check / pre-check - यह आईई-केवल निर्देश है जो केवल कैच करने योग्य संसाधनों पर लागू होता है।
  • दो बार या दर्जन भागों में समान हेडर भेजना। वहां कुछ PHP स्निपेट वास्तव में पिछले शीर्षकों को प्रतिस्थापित करते हैं, जिसके परिणामस्वरूप केवल अंतिम भेजा जा रहा है।

यदि आप चाहते हैं, तो आप जोड़ सकते हैं:

  • no-cache या max-age=0 , जो संसाधन (यूआरएल) "बाँध" बनायेगा और ब्राउज़र के लिए सर्वर की जांच करने की आवश्यकता होगी यदि कोई नया संस्करण है ( no-store पहले से ही यह भी मजबूत है)।
  • HTTP / 1.0 क्लाइंट्स के लिए अतीत में किसी दिनांक के साथ Expires जाता है (हालांकि वास्तविक HTTP / 1.0-only क्लाइंट इन दिनों पूरी तरह मौजूद नहीं हैं)।

बोनस: नया HTTP कैशिंग आरएफसी


एएसपी.नेट कोर के लिए, एक साधारण मिडलवेयर वर्ग बनाएं:

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://.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 );
    }
}

फिर इसे Startup.cs साथ पंजीकृत करें

app.UseMiddleware<NoCacheMiddleware>();

सुनिश्चित करें कि आप इसे कहीं और जोड़ दें

app.UseStaticFiles();

In addition to the headers consider serving your page via https . Many browsers will not cache https by default.


I had no luck with <head><meta> elements. Adding HTTP cache related parameters directly (outside of the HTML doc) does indeed work for me.

Sample code in Python using web.py web.header calls follows. I purposefully redacted my personal irrelevant utility code.

    import web
    import sys
    import PERSONAL-UTILITIES

    myname = "main.py"

    urls = (
        '/', 'main_class'
    )

    main = web.application(urls, globals())

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

    class main_class(object):
        def GET(self):
            web.header("Cache-control","no-cache, no-store, must-revalidate")
            web.header("Pragma", "no-cache")
            web.header("Expires", "0")
            return render.main_form()

        def POST(self):
            msg = "POSTed:"
            form = web.input(function = None)
            web.header("Cache-control","no-cache, no-store, must-revalidate")
            web.header("Pragma", "no-cache")
            web.header("Expires", "0")
            return render.index_laid_out(greeting = msg + form.function)

    if __name__ == "__main__":
        nargs = len(sys.argv)
        # Ensure that there are enough arguments after python program name
        if nargs != 2:
            LOG-AND-DIE("%s: Command line error, nargs=%s, should be 2", myname, nargs)
        # Make sure that the TCP port number is numeric
        try:
            tcp_port = int(sys.argv[1])
        except Exception as e:
            LOG-AND-DIE ("%s: tcp_port = int(%s) failed (not an integer)", myname, sys.argv[1])
        # All is well!
        JUST-LOG("%s: Running on port %d", myname, tcp_port)
        web.httpserver.runsimple(main.wsgifunc(), ("localhost", tcp_port))
        main.run()


मैंने web.config मार्ग उपयोगी पाया (इसे उत्तर में जोड़ने की कोशिश की लेकिन ऐसा लगता है कि यहां पोस्ट नहीं किया गया है)

<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>

और यहां व्यक्त करने के लिए एक्सप्रेस / node.js तरीका है:

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();
});

बैलससी द्वारा प्रदान किए गए उत्तर में शीर्षलेख ब्राउज़र के बैक बटन का उपयोग करते समय ब्राउज़र कैश से सामग्री प्रदर्शित करने से सफारी 5 (और संभावित रूप से पुराने संस्करण भी) को रोक नहीं सकते हैं। इसे रोकने का एक तरीका शरीर टैग में एक खाली ऑननलोड ईवेंट हैंडलर विशेषता जोड़ना है:

<body onunload=""> 

यह हैक स्पष्ट रूप से सफारी में बैक-फॉरवर्ड कैश तोड़ता है: बैक बटन पर क्लिक करते समय कोई क्रॉस-ब्राउज़र ऑनलोड ईवेंट होता है?


कैशिंग पर केस स्टडी के लिए यह लिंक देखें:

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

लेख के अनुसार सारांश, केवल Cache-Control: no-storeक्रोम, फ़ायरफ़ॉक्स और आईई पर काम करता है। आईई अन्य नियंत्रण स्वीकार करता है, लेकिन क्रोम और फ़ायरफ़ॉक्स नहीं है। लिंक कैशिंग के इतिहास और अवधारणा के सबूत दस्तावेज के इतिहास के साथ एक अच्छा पढ़ा गया है।


अस्वीकरण: मैं दृढ़ता से @ बलुस के जवाब पढ़ने का सुझाव देता हूं। निम्नलिखित कैशिंग ट्यूटोरियल पढ़ने के बाद: http://www.mnot.net/cache_docs/ (मुझे सलाह है कि आप इसे भी पढ़ लें), मुझे विश्वास है कि यह सही होगा। हालांकि, ऐतिहासिक कारणों से (और क्योंकि मैंने इसे स्वयं परीक्षण किया है), मैं नीचे अपना मूल उत्तर शामिल करूंगा:

मैंने PHP के लिए 'स्वीकृत' उत्तर देने का प्रयास किया, जो मेरे लिए काम नहीं करता था। तब मैंने थोड़ा सा शोध किया, थोड़ा सा संस्करण पाया, इसका परीक्षण किया, और यह काम किया। यह रहा:

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');

यह काम करना चाहिए। समस्या यह थी कि शीर्षलेख के समान भाग को दो बार सेट करते समय, यदि हेडर फ़ंक्शन के दूसरे तर्क के रूप में false नहीं भेजा जाता है, तो हेडर फ़ंक्शन बस पिछले header() कॉल को ओवरराइट करेगा। इसलिए, Cache-Control सेट करते समय, उदाहरण के लिए यदि कोई एक header() फ़ंक्शन कॉल में सभी तर्क डालना नहीं चाहता है, तो उसे ऐसा कुछ करना होगा:

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

here अधिक पूर्ण दस्तावेज देखें।


यदि आपको एसएसएल और कैश पर आईई 6-आईई 8 के साथ डाउनलोड की समस्याएं आ रही हैं: एमएस ऑफिस फाइलों के साथ नो-कैश हेडर (और समान मान) आप कैश का उपयोग कर सकते हैं: निजी, नो-स्टोर हेडर और POST अनुरोध पर फ़ाइल लौटाएं। यह काम करता हैं।


To complete BalusC -> answer If you are using perl you can use CGI to add HTTP headers.

Using 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 
                                           ))
        );
    }

Using 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>

Note: When I tried to use the html META, browsers ignored them and cached the page.


मेरे मामले में मैं क्रोम में समस्या को ठीक करता हूं

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

जहां उपयोगकर्ताओं को सुरक्षा कारणों से बटन पर क्लिक करने पर प्रीवियस फॉर्म डेटा की सामग्री को साफ़ करने की आवश्यकता होती है


प्रगामा: नो-कैश सेट करके मेरे पास सभी ब्राउज़रों में सबसे अच्छे और सबसे संगत परिणाम हैं





http-headers