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


Answers

(हे, हर कोई: कृपया ध्यान न दें कि सभी हेडर जिन्हें आप पा सकते हैं)

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

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

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

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

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

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

आपको कभी भी किसी की ज़रूरत नहीं है:

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

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

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

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

Question

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

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

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

हमारी आवश्यकता एक सुरक्षा परीक्षा से आई थी। हमारी वेबसाइट से प्रवेश करने के बाद आप वापस बटन दबा सकते हैं और कैश्ड पृष्ठों को देख सकते हैं।




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

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

कैश-नियंत्रण: नो-स्टोर
भिन्न: *

भिन्न शीर्षलेख की व्याख्या के लिए, http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.6 देखें

IE6-8 पर, FF1.5-3.5, क्रोम 2-3, सफारी 4, और ओपेरा 9-10, इन शीर्षलेखों ने पृष्ठ को सर्वर से अनुरोध किया जब आप पेज पर लिंक क्लिक करते हैं, या यूआरएल सीधे पता बार में इसमें लगभग 9 0% ब्राउज़र्स का उपयोग जनवरी '10 तक होता है

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

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




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

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

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




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

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

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

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




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

कैश-नियंत्रण: नो-कैश

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

प्रागः नो-कैश

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




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



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

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

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




1 99 5 में संशोधित एचटी हेडर को कुछ तारीख में सेट करना आमतौर पर चाल है।

यहां एक उदाहरण है:

Expires: Wed, 15 Nov 1995 04:58:08 GMT
Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
Cache-Control: no-cache, must-revalidate



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

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

और इसी तरह

स्वीकृत जवाब सही है, जिसमें हेडर सेट होना चाहिए, लेकिन उन्हें कैसे निर्धारित किया जाना चाहिए। इस तरह IIS7 के साथ काम करता है:

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

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




हेडर के अलावा के माध्यम से अपने पेज की सेवा पर विचार https । कई ब्राउज़र डिफ़ॉल्ट रूप से https कैश नहीं होंगे।




पूरा करने के लिए BalusC > - उत्तर आप उपयोग कर रहे हैं पर्ल आप HTTP हेडर को जोड़ने के लिए सीजीआई उपयोग कर सकते हैं।

पर्ल का उपयोग करना:

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

अपाचे का उपयोग 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>

नोट: जब मैं एचटीएमएल मेटा का उपयोग करने की कोशिश की, उन्हें नजरअंदाज कर दिया और पृष्ठ के कैश ब्राउज़रों।




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

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

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




इसके अलावा, बस अच्छा उपाय सुनिश्चित करें कि आप रीसेट कर ExpiresDefaultअपने में .htaccessअगर आपको लगता है कि कैशिंग को सक्षम करने का उपयोग कर रहे फ़ाइल।

ExpiresDefault "access plus 0 seconds"

बाद में, आप उपयोग कर सकते हैं ExpiresByTypeफ़ाइलें आप कैश करना चाहते हैं के लिए विशिष्ट मूल्यों को निर्धारित करने के लिए:

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

यह भी काम में आ सकता है आपके गतिशील फ़ाइलें, php जैसे आदि यदि ब्राउज़र द्वारा कैश किया जा रहा है, और आप बाहर क्यों समझ नहीं सकता। चेक ExpiresDefault