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


Answers

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

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

ताजगी मॉडल (धारा 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 कैशिंग आरएफसी

Question

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

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

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

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




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




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 .




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

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

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

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

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




अस्वीकरण: मैं दृढ़ता से @ बलुस के जवाब पढ़ने का सुझाव देता हूं। निम्नलिखित कैशिंग ट्यूटोरियल पढ़ने के बाद: 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 अधिक पूर्ण दस्तावेज देखें।




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

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

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




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

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

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




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

<body onunload=""> 

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




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




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

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

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




I just want to point out that if someone wants to prevent caching ONLY dynamic content, adding those additional headers should be made programmatically.

I edited configuration file of my project to append no-cache headers, but that also disabled caching static content, which isn't usually desirable. Modifying response headers in code assures that images and style files will be cached.

This is quite obvious, yet still worth mentioning.

And another caution. Be careful using ClearHeaders method from HttpResponse class. It may give you some bruises if you use it recklessly. Like it gave me.

After redirecting on ActionFilterAttribute event the consequences of clearing all headers are losing all session data and data in TempData storage. It's safer to redirect from an Action or don't clear headers when redirection is taking place.

On second thought I discourage all to use ClearHeaders method. It's better to remove headers separately. And to set Cache-Control header properly I'm using this code:

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



हेडर फ़ंक्शन के लिए 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);



मैंने पाया कि इस पृष्ठ के सभी उत्तरों में अभी भी समस्याएं थीं। विशेष रूप से, मैंने देखा है कि उनमें से कोई भी पृष्ठ को कैश किए गए संस्करण का उपयोग करने से 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






Links