2009-04-02 14 views
138

उबंटू में ब्राउज़र पृष्ठ कैशिंग को रोकने के लिए -> अपाचे -> Phusion यात्री -> रेल 2.3रेल

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

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

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

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

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


आह। इन सुझावों में से कोई भी उस व्यवहार को मजबूर नहीं कर रहा है जिसे मैं ढूंढ रहा हूं।

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

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

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

जेसन

उत्तर

305

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

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"] = "Fri, 01 Jan 1990 00:00:00 GMT" 
    end 
end 
+5

धन्यवाद ... मुझे एक टन बचाया! – mikeymo

+0

खोज के दो दिनों के बाद मुझे अंत में यह जवाब मिला। धन्यवाद एक लाख ^^ – StefanS

+1

मुझे सिर्फ गाना बजानेवालों को जोड़ने की जरूरत है और इस जवाब के लिए धन्यवाद (!!!) कहें। मुझे * बहुत लंबा * के लिए यह समस्या हो रही है। –

3

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

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

अपने दूसरे बिंदु लिए, यदि आप अपने वेब सर्वर पर की तरह

stylesheet_link_tag 

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

+3

'1.year.ago' अनावश्यक ओवरहेड है। अतीत में कुछ मनमानी समय चुनें, जैसे शुक्र, 01 जनवरी 1 99 0 00:00:00 GMT' – Archonic

1

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

13
+2

यह क्रोम 21.0.1180.57 में मेरे लिए काम नहीं किया। – Akrikos

+1

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

+1

यह काम नहीं करता है! – rardoz

0

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

उदाहरण:

before_filter :reset_cache, if: :user_completed_demographics? 

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

before_filter :reset_cache 

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