Rails tarayıcı sayfasının önbelleğe alınmasını önleme


151

Ubuntu -> Apache -> Phusion Yolcu -> Raylar 2.3

Sitemin ana kısmı tıklamalarınıza tepki veriyor. Bu nedenle, bir bağlantıyı tıklarsanız, sizi hedefe gönderir ve sayfanızı anında yeniden oluşturur.

Ancak, geri düğmesine basarsanız, yeni sayfayı görmezsiniz. Ne yazık ki, manuel yenileme olmadan görünmüyor; tarayıcı önbelleğe alıyor gibi görünüyor. Tarayıcının sayfayı önbelleğe almadığından emin olmak istiyorum.

Ayrı ayrı, ben do tüm statik varlıklar için uzak gelecekteki sona erme tarihleri ayarlamak istiyorum.

Bunu çözmenin en iyi yolu nedir? Bunu Rails'te çözmeli miyim? Apache? JavaScript?

Yardımın için teşekkürler Jason


Ne yazık ki. Bu önerilerin hiçbiri aradığım davranışı zorlamadı.

Belki bir javascript cevabı vardır? Raylar bir yorumda bir zaman damgası yazmak olabilir, sonra javascript kez beş saniye içinde (ya da ne olursa olsun) olup olmadığını görmek için kontrol var olabilir. Evetse, iyi, ancak hayırsa, sayfayı yeniden yüklensin mi?

Bunun işe yarayacağını düşünüyor musunuz?

Yardımların için teşekkür ederim,

Jason

Yanıtlar:


335

Sonunda bunu anladım - http://blog.serendeputy.com/posts/how-to-prevent-browsers-from-caching-a-page-in-rails/ inapplication_controller.rb

Raylardan Sonra 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

Raylar 4 ve daha eski versiyonlar:

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
Bu bir "request.xhr?" sadece ajax yenilemeleri ayarlanır ama normal sayfalar değil mi?
MintDeparture

3
Cache-Control: no-storeTarayıcı HTTP 1.1 ile uyumlu olduğu sürece gerçekten ihtiyacınız vardır . Bölüm 14.9.2 Önbellekler Tarafından Neler Saklanabilir
gaqzi

28
1 Oca 1990, Pazartesi günüydü!
Jan Hettich

2
Onun için çalışmıyor ben application_controller.rb aynı kodu eklemek var ve çıkış sonra geri düğmesi ile son sayfayı görmek mümkün. Lütfen yanlış olduğum yerde bana yol göster?
Thorin

1
Bu ayrıca raylar uygulamasında JS ve CSS'yi önbelleğe ALMAYACAK MI? Her istek için JS ve CSS sunucudan yüklenecek mi?
furiabhavesh


3

Bu çizgiyi kontrolörde biraz başarı ile kullandım. Safari ve Internet Explorer'da çalışıyor, ancak Firefox ile çalıştığını görmedim.

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

İkinci noktanız için, eğer raylar yardımcı yöntemleri kullanırsanız

stylesheet_link_tag

ve varsayılan ayarları web sunucunuzda bırakırsanız, öğeler genellikle oldukça iyi bir şekilde önbelleğe alınır.


3
1.year.agogereksiz ek yük. Sadece geçmişte biraz keyfi zaman seçinFri, 01 Jan 1990 00:00:00 GMT
Archonic

6
@Archonic 1 Ocak 1990 Pazartesi oldu!
Thomas R. Koll

1

Daha temiz yol, bazı mantığa dayalı olarak Cache-Control üstbilgisini değiştiren bir Rack ara katman yazılımı yazmak olacaktır (örneğin, yalnızca application / xml mime-type için). Ya da daha çirkin ama yine de çalışan bir yaklaşım için ActionDispatch :: Response :: DEFAULT_CACHE_CONTROL sabiti 'önbelleksiz' olarak değiştirilebilir. Elbette, denetleyici ve / veya eylem ayrıntı düzeyi gerekiyorsa, bunu denetleyicide yapmak daha iyidir.


1

Dikkat edilmesi gereken nokta: Önbelleği koşullu olarak temizleyemezsiniz ( before_filteryalnızca reset_cachekullanıcının zaten orada olması durumunda arama yapması gibi ). Koşulsuz olarak önbelleği temizlemeniz gerekir , çünkü tarayıcı sadece bu kez, son kez gerek duymasa bile yeniden yüklenmesi gerekip gerekmediğini görmek için yeni bir istekte bulunmaz.

Misal:

before_filter :reset_cache, if: :user_completed_demographics?

tarayıcı Geri düğmesinde orijinal önbellek başlıklarını kullandığından, kullanıcıların bulunduktan sonra geri gelmelerini önlemek için çalışmaz.

before_filter :reset_cache

ancak (sayfayı yeniledikten ve önbelleği temizledikten sonra önbelleği temizledikten sonra açık bir şekilde çalışacaktır), çünkü ilk istekte tarayıcı gelip no-cache, no-store, ...sayfa yüklemelerine uygulayacaktır.


0

no_cache_control Gem.

Bir penetrasyon testini (BURP, Detectify vb.) Geçmek gibi tüm yanıtlar için bunu yapmanız gerekiyorsa, tüm yanıtlara aşağıdaki başlıkları eklemek için bu Gem on Rails 4+ uygulamasını yükleyebilirsiniz:

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

Bir cazibe gibi çalışır ve herhangi bir şey yapmak için kimlik doğrulaması gerektiren güvenli HTTPS web uygulamaları için gerçekten doğru yoldur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.