रेल पेज में ब्राउज़र पेज कैशिंग को कैसे रोकें


151

उबंटू -> अपाचे -> फ़्यूज़न पैसेंजर -> रेल 2.3

मेरी साइट का मुख्य भाग आपके क्लिकों पर प्रतिक्रिया करता है। इसलिए, यदि आप एक लिंक पर क्लिक करते हैं, तो यह आपको गंतव्य पर भेज देगा, और तुरंत आपके पृष्ठ को पुन: उत्पन्न कर देगा।

लेकिन, यदि आप बैक बटन दबाते हैं, तो आप नया पेज नहीं देखते हैं। दुर्भाग्य से, यह बिना मैनुअल रिफ्रेश के नहीं दिख रहा है; ऐसा लगता है कि ब्राउज़र इसे कैशिंग कर रहा है। मैं यह सुनिश्चित करना चाहता हूं कि ब्राउज़र पृष्ठ को कैश न करे।

अलग-अलग, मैं अपनी सभी स्थिर संपत्तियों के लिए भविष्य की समाप्ति तिथि निर्धारित करना चाहता हूं।

इसे हल करने का सबसे अच्छा तरीका क्या है? क्या मुझे इसे रेल में हल करना चाहिए? अमरीका की एक मूल जनजाति? जावास्क्रिप्ट?

आपकी मदद के लिए धन्यवाद, जेसन


अफसोस। इन सुझावों में से किसी ने भी उस व्यवहार को मजबूर नहीं किया जिसकी मुझे तलाश है।

शायद एक जावास्क्रिप्ट उत्तर है? मैं एक टिप्पणी में टाइमस्टैम्प को लिख सकता हूं, फिर जावास्क्रिप्ट को यह देखने के लिए जांचें कि क्या समय पांच सेकंड के भीतर है (या जो भी काम करता है)। यदि हाँ, तो ठीक है, लेकिन यदि नहीं, तो पृष्ठ पुनः लोड करें?

क्या आपको लगता है कि यह काम करेगा?

आपकी सभी मदद का धन्यवाद,

जेसन

जवाबों:


335

अंत में यह पता चला - http://blog.serendeputy.com/posts/how-to-prevent-browsers-from-caching-a-page-in-rails/ inapplication_controller.rb

रेल के बाद 5:

class ApplicationController < ActionController::Base

  before_action :set_cache_headers

  private

  def set_cache_headers
    response.headers["Cache-Control"] = "no-cache, no-store"
    response.headers["Pragma"] = "no-cache"
    response.headers["Expires"] = "Mon, 01 Jan 1990 00:00:00 GMT"
  end
end

रेल 4 और पुराने संस्करण:

class ApplicationController < ActionController::Base

  before_filter :set_cache_headers

  private

  def set_cache_headers
    response.headers["Cache-Control"] = "no-cache, no-store"
    response.headers["Pragma"] = "no-cache"
    response.headers["Expires"] = "Mon, 01 Jan 1990 00:00:00 GMT"
  end
end

3
क्या इसे "if request.xhr?" में लपेटा जाना चाहिए। इसलिए यह केवल अजाक्स रिफ्रेश पर सेट हो जाता है लेकिन सामान्य पृष्ठ नहीं है?
मिंटडिपार्टेचर

3
आपको केवल तभी Cache-Control: no-storeतक की आवश्यकता है जब तक कि ब्राउज़र HTTP 1.1 के अनुरूप है। धारा 14.9.2 क्या कैश द्वारा संग्रहीत किया जा सकता है
2

28
1 जनवरी, 1990, एक सोमवार था!
Jan Hettich

2
मेरे लिए इसका काम नहीं कर रहा है, मैंने application_controller.rb में एक ही कोड जोड़ा है और लॉगआउट करने के बाद मैं बैक पेज पिछले बटन को देख पा रहा हूं। कृपया मार्गदर्शन करें कि मैं कहाँ गलत हूँ?
थोरिन

1
क्या यह जेएस और सीएसएस को रेल ऐप में कैश नहीं करेगा? क्या JS और CSS को प्रत्येक अनुरोध के लिए सर्वर से लोड किया जाएगा?
पूर्वाह्न

14

3
expires_nowकेवल no-cacheहेडर भेजता है । ब्राउज़र के आधार पर यह पर्याप्त नहीं हो सकता है। (उदाहरण के लिए फ़ायरफ़ॉक्स no-storeनॉन-एचटीटीपीएस कनेक्शन चाहता है : developer.mozilla.org/en/docs/Using_Firefox_1.5_caching )
डैनियल रिकोस्की

1
सहमत, यह एक वैध समाधान नहीं है, रेल 5.2 और क्रोम 77 के साथ परीक्षण किया गया no-storeहै।
एंड्रयूसाउथपॉ

3

मैंने नियंत्रक में कुछ सफलता के साथ इस लाइन का उपयोग किया है। यह सफारी और इंटरनेट एक्सप्लोरर में काम करता है लेकिन मैंने इसे फ़ायरफ़ॉक्स के साथ काम करते नहीं देखा है।

response.headers["Expires"] = "#{1.year.ago}"

अपने दूसरे बिंदु के लिए, यदि आप रेल सहायक विधियों का उपयोग करते हैं, जैसे

stylesheet_link_tag

और अपने वेबसर्वर पर डिफ़ॉल्ट सेटिंग्स छोड़ दें, संपत्ति आमतौर पर बहुत अच्छी तरह से कैश की जाती है।


3
1.year.agoअनावश्यक ओवरहेड है। बस अतीत में कुछ मनमाना समय चुनेंFri, 01 Jan 1990 00:00:00 GMT
आर्कटिक

6
@ एरोनिक 1 जून 1990 एक सोमवार था!
थॉमस आर। कोल

1

क्लीनर तरीका एक रैक मिडलवेयर लिखना होगा, जो कुछ लॉजिक के आधार पर कैश-कंट्रोल हेडर को बदलता है (उदाहरण के लिए, केवल एप्लिकेशन / xml माइम-टाइप के लिए)। या, एक बदसूरत, लेकिन अभी भी काम कर रहे दृष्टिकोण के लिए, कोई भी ActionDispatch :: प्रतिक्रिया को बदल सकता है :: DEFAULT_CACHE_CONTROL निरंतर 'नो-कैश'। बेशक, यदि नियंत्रक और / या कार्रवाई की ग्रैन्युलैरिटी की आवश्यकता है, तो नियंत्रक में ऐसा करना बेहतर है।


1

ध्यान दें: आप सशर्त रूप से कैश को साफ़ नहीं कर सकते हैं (जैसे कि यदि उपयोगकर्ता before_filterकेवल reset_cacheपहले से ही कॉल करता है तो)। आपको कैश को बिना शर्त साफ करने की आवश्यकता है , क्योंकि ब्राउज़र केवल यह देखने के लिए नया अनुरोध नहीं करेगा कि क्या इस बार, उसे फिर से लोड करने की आवश्यकता है, भले ही उसे अंतिम समय की आवश्यकता न हो।

उदाहरण:

before_filter :reset_cache, if: :user_completed_demographics?

उपयोगकर्ताओं को वहां आने के बाद वापस आने से रोकने के लिए काम नहीं करेगा, क्योंकि ब्राउज़र बैक बटन पर मूल कैश हेडर का उपयोग करता है।

before_filter :reset_cache

हालांकि, काम करेगा (पेज को रिफ्रेश करने के बाद और इससे पहले कि आप कैश को क्लीयर करें, जाहिर है), चूंकि, पहले अनुरोध पर, ब्राउज़र को यह मिलेगा no-cache, no-store, ...और इसे भविष्य के पेज लोड पर लागू होगा।


0

no_cache_control रत्न।

यदि आपको सभी प्रतिक्रियाओं के लिए ऐसा करने की आवश्यकता है, जैसे कि एक प्रवेश परीक्षा (BURP, Detectify, आदि) पास करने के लिए, आप सभी प्रतिक्रियाओं में निम्नलिखित हेडर जोड़ने के लिए रेल 4+ पर इस जेम को स्थापित कर सकते हैं:

Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: -1

एक आकर्षण की तरह काम करता है और वास्तव में सुरक्षित, HTTPS वेब अनुप्रयोगों के लिए जाने के लिए सही तरीका है जो कुछ भी करने के लिए प्रमाणीकरण की आवश्यकता होती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.