কীভাবে রেলগুলিতে ব্রাউজার পৃষ্ঠার ক্যাচিং প্রতিরোধ করবেন


151

উবুন্টু -> অ্যাপাচি -> ফিউশন প্যাসেঞ্জার -> রেলগুলি ২.৩

আমার সাইটের প্রধান অংশটি আপনার ক্লিকগুলিতে প্রতিক্রিয়া জানায়। সুতরাং, আপনি যদি কোনও লিঙ্কে ক্লিক করেন তবে এটি আপনাকে গন্তব্যে পাঠিয়ে দেবে এবং তাত্ক্ষণিকভাবে আপনার পৃষ্ঠাটি পুনরায় তৈরি করবে।

তবে, আপনি যদি পিছনের বোতামটি হিট করেন তবে আপনি নতুন পৃষ্ঠাটি দেখতে পাচ্ছেন না। দুর্ভাগ্যক্রমে, এটি ম্যানুয়াল রিফ্রেশ ছাড়া প্রদর্শিত হচ্ছে না; ব্রাউজারটি এটি ক্যাশে করছে প্রদর্শিত হচ্ছে। আমি নিশ্চিত করতে চাই যে ব্রাউজারটি পৃষ্ঠাটি ক্যাশে করে না।

পৃথকভাবে, আমি আমার সমস্ত স্থিতিশীল সম্পদের জন্য সুদূর ভবিষ্যতের মেয়াদ নির্ধারণ করতে চাই না।

এটি সমাধান করার সর্বোত্তম উপায় কী? আমি কি এটা কি জেলগুলিতে সমাধান করব? এ্যাপাচি? জাভাস্ক্রিপ্ট?

আপনার সমস্ত সহায়তার জন্য ধন্যবাদ, জেসন


হায়রে। এই পরামর্শগুলির মধ্যে কোনওটিই আমি যে আচরণটি সন্ধান করছি তাতে বাধ্য হয় না।

সম্ভবত একটি জাভাস্ক্রিপ্ট উত্তর আছে? আমি কোনও মন্তব্যে রেলগুলিকে টাইমস্ট্যাম্প লিখতে পারি, তারপরে জাভাস্ক্রিপ্ট পরীক্ষা করে দেখতে হবে যে সময়গুলি পাঁচ সেকেন্ডের মধ্যে রয়েছে (বা যা কিছু কাজ করে)। যদি হ্যাঁ, তবে ঠিক আছে, তবে যদি না হয় তবে পৃষ্ঠাটি পুনরায় লোড করবেন?

আপনি কি মনে করেন এটি কাজ করবে?

সব আপনার সাহায্যের জন্য ধন্যবাদ,

জেসন

উত্তর:


335

পরিশেষে এটিকে আবিষ্কার করলেন - http://blog.serendeputy.com/posts/how-to-prevent-browser-from-caching-a-page-in-rails/application_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
এটি কি "অনুরোধ.এক্সএইচআর?" এ মোড়ানো উচিত? সুতরাং এটি কেবল আজাক্স রিফ্রেশে সেট হয়ে যায় তবে সাধারণ পৃষ্ঠাগুলি হয় না?
মিন্টডেপচার

3
Cache-Control: no-storeব্রাউজারটি এইচটিটিপি 1.1 এর সাথে সামঞ্জস্যপূর্ণ হওয়া পর্যন্ত আপনার কেবল সত্যই প্রয়োজন । বিভাগ 14.9.2 কি ক্যাশে দ্বারা সঞ্চিত হতে পারে
gaqzi

28
জানুয়ারী 1, 1990, সোমবার ছিল!
জান হেটিচ

2
এটি আমার পক্ষে কাজ করছে না আমি প্রয়োগ কোড_কন্ট্রোলআরবি তে একই কোড যুক্ত করেছি এবং লগআউট করার পরে আমি শেষ পৃষ্ঠাটি পিছনে বোতামটি দেখতে সক্ষম হয়েছি। আমি যেখানে ভুল আমি দয়া করে গাইড করুন?
থোরিন

1
এটি কি রেল অ্যাপগুলিতে জেএস এবং সিএসএসকেও ক্যাশে করবে না? প্রতিটি অনুরোধের জন্য সার্ভার থেকে জেএস এবং সিএসএস লোড করা হবে?
ফুরিয়াভবেশ

14

3
expires_nowকেবল no-cacheশিরোনাম প্রেরণ করে । ব্রাউজারের উপর নির্ভর করে এটি যথেষ্ট নাও হতে পারে। (উদাহরণস্বরূপ ফায়ারফক্স no-storeনন-এইচটিটিপিএস সংযোগগুলির জন্য একটি চায় : ডেভেলপার.মোজিলা.আর /
ডকস / ইউজিং_ফায়ারফক্স_1.5_caching

1
সম্মতি জানানো হয়েছে, এটি একটি বৈধ সমাধান নয়, এটি রেল 5.2 এবং Chrome 77 এর সাথে পরীক্ষিত no-storealso এছাড়াও এটিও প্রয়োজন।
অ্যান্ড্রুসথপাউ

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

পরিষ্কার উপায়টি হ'ল একটি র্যাক মিডলওয়্যার লিখতে হবে যা কিছু যুক্তির উপর ভিত্তি করে ক্যাশে-নিয়ন্ত্রণ শিরোনাম পরিবর্তন করে (উদাহরণস্বরূপ, কেবল অ্যাপ্লিকেশন / এক্সএমএল মাইম-টাইপের জন্য)। বা, একটি কুরুচিপূর্ণ, কিন্তু এখনও কর্মক্ষম পদ্ধতির জন্য, অ্যাকশনডিস্পাচ :: প্রতিক্রিয়া :: 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 জহর।

আপনার যদি সমস্ত প্রতিক্রিয়াগুলির জন্য এটি করার দরকার হয়, যেমন অনুপ্রবেশ পরীক্ষা (বিআরপি, সনাক্তকরণ ইত্যাদি) পাস করার জন্য, আপনি সমস্ত প্রতিক্রিয়াগুলিতে নিম্নলিখিত শিরোনাম যুক্ত করতে এই রত্নটি 4++ রেলগুলিতে ইনস্টল করতে পারেন:

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

কবজির মতো কাজ করে এবং সুরক্ষিত, HTTPS ওয়েব অ্যাপ্লিকেশনগুলির জন্য যাবার জন্য সত্যই সঠিক উপায় যা কিছু করার জন্য প্রমাণীকরণের প্রয়োজন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.